Differences from Lua are underlined.
chunk ::= block
block ::= {stat} [retstat]
stat ::= ‘;’ |
varlist ‘=’ explist |
var compassignop exp |
functioncall |
label |
break |
goto Name |
do block end |
while exp [do] block end |
repeat block until exp |
if exp [then] block {elif exp [then] block} [else block] end |
for Name ‘=’ exp ‘,’ exp [‘,’ exp] [do] block end |
for namelist in explist [do] block end |
fun funcname funcbody |
let fun Name funcbody |
let 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 | Number | String | ‘...’ | functiondef |
prefixexp | tableconstructor | exp binop exp | unop exp
prefixexp ::= var | functioncall | ‘(’ exp ‘)’
functioncall ::= prefixexp args | prefixexp ‘:’ Name args
args ::= ‘(’ [explist] ‘)’ | tableconstructor | String
functiondef ::= fun funcbody
funcbody ::= ‘(’ [parlist] ‘)’ (block end | ‘=>’ (exp | ‘(’ explist ‘)’))
parlist ::= namelist [‘,’ ‘...’] | ‘...’
tableconstructor ::= ‘{’ [fieldlist] ‘}’
fieldlist ::= field {fieldsep field} [fieldsep]
field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | String ‘=’ exp | exp
fieldsep ::= ‘,’ | ‘;’
binop ::= ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘^’ | ‘%’ | ‘..’ |
‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ | ‘!=’
and | or
compassignop ::= ‘+=’ | ‘-=’ | ‘*=’ | ‘/=’ | ‘%=’
unop ::= ‘-’ | not | ‘#’