Lua 四点一语法 |
|
以下是 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