Lua 四点一语法

lua-users home
wiki

LuaGrammar 移动并保留历史记录

以下是 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

请注意,左括号、左大括号和字面量优先被视为参数,而不是作为新表达式的开始。此规则在将调用解释为语句或将主表达式、变量或调用解释为表达式时生效。如果没有此规则,语法将是模棱两可的。

这是 Lua 4.1 语法中我不满意的更改。它使得 ; 不再是纯粹的可选语句终止符。 -- 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


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2007 年 2 月 22 日下午 7:24 GMT (差异)