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** | ‘**#**’ | ‘**~**’