# 9 – Lua 的完整语法
这是一份采用扩展 BNF 描述的 Lua 完整语法。 在扩展 BNF 中, {A} 表示 0 或多个 A , [A] 表示一个可选的 A 。 (操作符优先级,参见 [§3.4.8](#3.4.8); 对于最终符号,名字,数字,字符串字面量的解释,参见 [§3.1](#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** | ‘**#**’ | ‘**~**’
```