[英]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.