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* | `*#*`