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