我想用BNF格式编写LR(1)语法,用于The Complete Syntax of Lua中这两条规则所描述的语言:
parlist ::= namelist [`,´ `...´] | `...´
namelist ::= Name {`,´ Name}
我已经尝试了以下语法,但根据我使用的工具,由于shift-reduce冲突而且#34;而不是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)语法?
答案 0 :(得分:0)
这是一个简单的问题:
parlist ::= Name
parlist ::= ...
parlist ::= Name , parlist
这是一个稍微不那么简单的,具有左递归的优点:
parlist ::= namelist
parlist ::= namelist , ...
parlist ::= ...
namelist ::= Name
namelist ::= namelist , Name
使用人工namelist1
非终端的语法相当人为的失真,看起来像是从LL语法中取出,只会引起问题。 (它也没有制作语法LL(1),尽管可以通过左上角分解第一个替代方法来轻松完成。)
答案 1 :(得分:0)
这是一个没有冲突的野牛语法。它是LALR(1),它也使它成为LR(1):
%token ELIPSES COMMA NAME
%%
parlist : namelist parlistsuffix
| ELIPSES
;
parlistsuffix: COMMA ELIPSES
| /* epsilon */
;
namelist: namelist COMMA NAME
| NAME
;