Lua Four One 語法

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     --> 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 UTC (差異)