Lua Four One Grammar |
|
附带的是 Lua (4.1?) 的 LALR(1) 文法。
block --> { stmt [ ';' ] } [ finish [ ';' ] ]
stmt --> var { ',' var } '=' exprs
| call
| DO block END
| WHILE expr DO block END
| REPEAT block UNTIL expr
| IF expr THEN block
{ ELSEIF expr THEN block }
[ ELSE block ] END
| FOR name '=' expr ',' expr [ ',' expr ] DO block END
| FOR name ',' name IN expr DO block END
| FUNCTION func_name '(' [ params ] ')' block END
| LOCAL name { ',' name } [ '=' exprs ]
finish --> RETURN [ exprs ] | BREAK [ name ]
func_name --> name { '.' key } [ ':' key ]
key --> name
params --> '...' | name { ',' name } [ ',' '...' ]
exprs --> expr { ',' expr }
expr --> primary | var | call | expr binop expr | unop expr
primary --> NIL | number | literal | '%' name | table_cons
| FUNCTION '(' [ params ] ')' block END | '(' expr ')'
var --> name
| primary index
| var index
| call index
index --> '[' expr ']' | '.' key
call --> primary [ ':' key ] args
| var [ ':' key ] args
| call [ ':' key ] args
args --> '(' [ exprs ] ')' | table_cons | literal
table_cons --> '{' [ fields ] '}'
fields --> expr_fields [ ';' [ mapping_fields ] ]
| mapping_fields [ ';' [ expr_fields ] ]
| ';' [ expr_fields | mapping_fields ]
expr_fields --> exprs [ ',' ]
mapping_fields --> mapping_field { ',' mapping_field } [ ',' ]
mapping_field --> '[' expr ']' '=' expr | key '=' expr
binop --> '+' | '-' | '*' | '/' | '^' | '..' | AND | OR
| '<' | '<=' | '>' | '>=' | '==' | '~='
unop --> '-' | NOT
请注意,左圆括号、左花括号和字面量优先被视为参数,而不是启动新表达式。当将调用解释为语句、或将主表达式、变量或调用解释为表达式时,此规则生效。没有此规则,文法将存在歧义。
; 不再是纯粹的可选语句终止符。 -- ET
可以通过替换 key 产生式为以下内容,来无歧义地泛化 key 以包含关键字。
key --> name | AND | BREAK | DO | END | ELSE | ELSEIF
| FOR | FUNCTION | GLOBAL | IF | IN | LOCAL | NIL
| NOT | OR | RETURN | REPEAT | THEN | UNTIL | WHILE
-- John D. Ramsdell