9. Полный синтаксис Lua

9. Полный синтаксис Lua

Здесь дан полный синтаксис Lua в расширенной форме Бэкуса — Наура (extended BNF). Как обычно в расширенной BNF, {A} означает ноль или более элементов A (повторение), а [A] означает дополнительный, необязательный элемент A. (Описание приоритета операторов смотрите в §3.4.8; а описание [терминалов] Name, Numeral, и LiteralString, смотрите §3.1.)

	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 ::=  ‘**+**’ | ‘**\-**’ | ‘**\***’ | ‘**/**’ | ‘**//**’ | ‘**^**’ | ‘**%**’ |
		 ‘**&**’ | ‘**~**’ | ‘**|**’ | ‘**\>>**’ | ‘**<<**’ | ‘**..**’ |
		 ‘**<**’ | ‘**<=**’ | ‘**\>**’ | ‘**\>=**’ | ‘**\==**’ | ‘**~=**’ |
		 **and** | **or**

	unop ::= ‘**\-**’ | **not** | ‘**#**’ | ‘**~**’