具有尾随省略的函数参数的LR(1)BNF语法

时间:2017-07-29 03:08:48

标签: parsing grammar context-free-grammar bnf lr

我想用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)语法?

2 个答案:

答案 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
        ;