difftastic/vendored_parsers/tree-sitter-lua/docs/extended_bnf.md

2.3 KiB

The complete syntax of Lua

Here is the complete syntax of Lua in extended BNF. As usual in extended BNF, {A} means 0 or more As, and [A] means an optional A.



chunk ::=
  block

block ::=
  {stat} [retstat]

stat ::=
  ';' | varlist '=' explist | functioncall | label | break | goto Name |
  do block end |
  while exp do block end |
  repeat block until exp |
  if exp then block {elseif exp then block} [else block] end |
  for Name '=' exp ',' exp [',' exp] do block end |
  for namelist in explist do block end |
  function funcname funcbody |
  local function Name funcbody |
  local namelist ['=' explist]

retstat ::=
  return [explist] [';']

label ::=
  '::' Name '::'

funcname ::=
  Name {'.' Name} [':' Name]

varlist ::=
  var {, var}

var ::=
  Name | prefixexp '[' exp ']' | prefixexp '.' Name

namelist ::=
  Name {',' Name}

explist ::=
  exp {',' exp}

exp ::=
  nil | false | true | Numeral | LiteralString | '...' | functiondef |
  prefixexp | tableconstructor | exp binop exp | unop exp

prefixexp ::=
  var | functioncall | '(' exp ')'

functioncall ::=
  prefixexp args | prefixexp ':' Name args

args ::=
  '(' [explist] ')' | tableconstructor | LiteralString

functiondef ::=
  function funcbody

funcbody ::=
  '(' [parlist] ')' block end

parlist ::=
  namelist [',' '...'] | '...'

tableconstructor ::=
  '{' [ fieldlist ] '}'

fieldlist ::=
  field {fieldsep field} [fieldsep]

field ::=
  '[' exp ']' '=' exp | Name '=' exp | exp

fieldsep ::=
  ',' | ';'

binop ::=
  '+' | '-' | '*' | '/' | '//' | '^' | '%' |
  '&' | '~' | '|' | '>>' | '<<' | '..' |
  '<' | '<=' | '>' | '>=' | '==' | '~=' |
  not | or

unop ::=
   '-' | not | '#' | '~'