# 语法规则
chunk = block
block = {stat} [retstat]
type = Name |
'(' {type} [‘,’ type] ‘)’ ‘=>’ type
record = ‘type’ Name {‘<’ { Name [‘,’ Name ] } ‘>’} ‘=’
‘{‘ { Name ‘:’ type [ ‘,’ Name ‘:’ type ] } ‘}’
typedef = ‘type’ Name {‘<’ { Name [‘,’ Name ] } ‘>’} ‘=’ Name {‘<’ { Name [‘,’ Name ] } ‘>’}
stat = ‘;’ |
varlist ‘=’ explist |
functioncall |
label |
break |
goto Name |
record |
typedef |
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
name = Name {‘:’ type } || 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 | ‘#’ | ‘~’