9 – The Complete Syntax of Lua

Here is the complete syntax of Lua in extended BNF. As usual in extended BNF, {A} means 0 or more As, and [A] means an optional A. (For operator precedences, see §3.4.8; for a description of the terminals Name, Numeral, and LiteralString, see §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 attnamelist [‘=’ explist]
  18. attnamelist ::= Name attrib {‘,’ Name attrib}
  19. attrib ::= [‘<’ Name ‘>’]
  20. retstat ::= return [explist] [‘;’]
  21. label ::= ‘::’ Name ‘::’
  22. funcname ::= Name {‘.’ Name} [‘:’ Name]
  23. varlist ::= var {‘,’ var}
  24. var ::= Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name
  25. namelist ::= Name {‘,’ Name}
  26. explist ::= exp {‘,’ exp}
  27. exp ::= nil | false | true | Numeral | LiteralString | ‘...’ | functiondef |
  28. prefixexp | tableconstructor | exp binop exp | unop exp
  29. prefixexp ::= var | functioncall | ‘(’ exp ‘)’
  30. functioncall ::= prefixexp args | prefixexp ‘:’ Name args
  31. args ::= ‘(’ [explist] ‘)’ | tableconstructor | LiteralString
  32. functiondef ::= function funcbody
  33. funcbody ::= ‘(’ [parlist] ‘)’ block end
  34. parlist ::= namelist [‘,’ ‘...’] | ‘...’
  35. tableconstructor ::= ‘{’ [fieldlist] ‘}’
  36. fieldlist ::= field {fieldsep field} [fieldsep]
  37. field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
  38. fieldsep ::= ‘,’ | ‘;’
  39. binop ::= ‘+’ | ‘-’ | ‘*’ | ‘/’ | //’ | ‘^’ | ‘%’ |
  40. ‘&’ | ‘~’ | ‘|’ | ‘>>’ | ‘<<’ | ‘..’ |
  41. ‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ |
  42. and | or
  43. unop ::= ‘-’ | not | ‘#’ | ‘~’