[英]LR(1) BNF grammar for function parameters with trailing elipsis
我想以BNF形式針對《 Lua的完整語法》中這兩個規則描述的語言編寫LR(1)語法:
parlist ::= namelist [`,´ `...´] | `...´
namelist ::= Name {`,´ Name}
我已經嘗試了以下語法,但是根據我使用的工具,由於“ shift-reduce沖突”,兩者都是“不是LR(1)”:
parlist ::= namelist
parlist ::= namelist , ...
parlist ::= ...
namelist ::= Name namelist1
namelist1 ::= , Name namelist1
namelist1 ::= <epsilon>
parlist ::= namelist
parlist ::= namelist , ...
parlist ::= ...
namelist ::= namelist1 Name
namelist1 ::= namelist1 Name ,
namelist1 ::= <epsilon>
該語言是否有BNF形式的LR(1)語法?
這是一個簡單的例子:
parlist ::= Name
parlist ::= ...
parlist ::= Name , parlist
這是一個不太簡單的方法,它具有左遞歸的優點:
parlist ::= namelist
parlist ::= namelist , ...
parlist ::= ...
namelist ::= Name
namelist ::= namelist , Name
使用人為的namelist1
非終結namelist1
對人為的語法進行相當人為的變形,這似乎是從LL語法中提取出來的,這只會引起問題。 (盡管也可以通過左因子分解上述第一種選擇來輕松完成語法LL(1)的編寫。)
這是沒有沖突的野牛語法。 是LALR(1),這也使其成為LR(1):
%token ELIPSES COMMA NAME
%%
parlist : namelist parlistsuffix
| ELIPSES
;
parlistsuffix: COMMA ELIPSES
| /* epsilon */
;
namelist: namelist COMMA NAME
| NAME
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.