九、Lua 的完整语法

这是一份采用扩展 BNF 描述的 Lua 完整语法。在扩展 BNF 中,{A} 表示 0 或多个 A ,[A] 表示一个可选的 A 。(操作符优先级,参见 §3.4.8 ;对于最终符号,名字,数字,字符串字面量的解释,参见 §3.1

  1. chunk ::= block
  2. block ::= {stat} [retstat]
  3. stat ::= ‘;’ |
  4. varlist ‘=’ explist |
  5. functioncall |
  6. label |
  7. break |
  8. goto Name |
  9. do block end |
  10. while exp do block end |
  11. repeat block until exp |
  12. if exp then block {elseif exp then block} [else block] end |
  13. for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end |
  14. for namelist in explist do block end |
  15. function funcname funcbody |
  16. local function Name funcbody |
  17. local namelist [‘=’ explist]
  18. retstat ::= return [explist] [‘;’]
  19. label ::= ‘::’ Name ‘::’
  20. funcname ::= Name {‘.’ Name} [‘:’ Name]
  21. varlist ::= var {‘,’ var}
  22. var ::= Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name
  23. namelist ::= Name {‘,’ Name}
  24. explist ::= exp {‘,’ exp}
  25. exp ::= nil | false | true | Numeral | LiteralString | ‘...’ | functiondef |
  26. prefixexp | tableconstructor | exp binop exp | unop exp
  27. prefixexp ::= var | functioncall | ‘(’ exp ‘)’
  28. functioncall ::= prefixexp args | prefixexp ‘:’ Name args
  29. args ::= ‘(’ [explist] ‘)’ | tableconstructor | LiteralString
  30. functiondef ::= function funcbody
  31. funcbody ::= ‘(’ [parlist] ‘)’ block end
  32. parlist ::= namelist [‘,’ ‘...’] | ‘...’
  33. tableconstructor ::= ‘{’ [fieldlist] ‘}’
  34. fieldlist ::= field {fieldsep field} [fieldsep]
  35. field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
  36. fieldsep ::= ‘,’ | ‘;’
  37. binop ::= ‘+’ | ‘-’ | ‘*’ | ‘/’ | //’ | ‘^’ | ‘%’ |
  38. ‘&’ | ‘~’ | ‘|’ | ‘>>’ | ‘<<’ | ‘..’ |
  39. ‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ |
  40. and | or
  41. unop ::= ‘-’ | not | ‘#’ | ‘~’