Here is the complete syntax of Lua in extended BNF. (It does not describe operator precedences.)
chunk ::= {stat [`*;*`]} [laststat [`*;*`]]
block ::= chunk
stat ::= varlist1 `*=*` explist1 |
functioncall |
*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* explist1 *do* block *end* |
*function* funcname funcbody |
*local* *function* Name funcbody |
*local* namelist [`*=*` explist1]
laststat ::= *return* [explist1] | *break*
funcname ::= Name {`*.*` Name} [`*:*` Name]
varlist1 ::= var {`*,*` var}
var ::= Name | prefixexp `*[*` exp `*]*` | prefixexp `*.*` Name
namelist ::= Name {`*,*` Name}
explist1 ::= {exp `*,*`} exp
exp ::= *nil* | *false* | *true* | Number | String | `*...*` | function |
prefixexp | tableconstructor | exp binop exp | unop exp
prefixexp ::= var | functioncall | `*(*` exp `*)*`
functioncall ::= prefixexp args | prefixexp `*:*` Name args
args ::= `*(*` [explist1] `*)*` | tableconstructor | String
function ::= *function* funcbody
funcbody ::= `*(*` [parlist1] `*)*` block *end*
parlist1 ::= namelist [`*,*` `*...*`] | `*...*`
tableconstructor ::= `*{*` [fieldlist] `*}*`
fieldlist ::= field {fieldsep field} [fieldsep]
field ::= `*[*` exp `*]*` `*=*` exp | Name `*=*` exp | exp
fieldsep ::= `*,*` | `*;*`
binop ::= `*+*` | `*-*` | `***` | `*/*` | `*^*` | `*%*` | `*..*` |
`*<*` | `*<=*` | `*>*` | `*>=*` | `*==*` | `*~=*` |
*and* | *or*
unop ::= `*-*` | *not* | `*#*`