Lua 5.3 Reference Manual

by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes

Copyright © 2015–2018 Lua.org, PUC-Rio. Freely available under the terms of the Lua license.

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 Precedence; for a description of the terminals Name, Numeral, and LiteralString, see Lexical Conventions.)

			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 | '#' | '~'