【问题标题】:LR(1) BNF grammar for function parameters with trailing elipsisLR(1) BNF 文法,用于带有尾随省略号的函数参数
【发布时间】:2018-01-05 04:37:51
【问题描述】:

我想为The Complete Syntax of Lua的这两条规则描述的语言写一个BNF形式的LR(1)语法:

parlist ::= namelist [`,´ `...´] | `...´
namelist ::= Name {`,´ Name}

我尝试了以下语法,但根据我使用的工具,两者都是“由于移位减少冲突而不是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) 语法?

【问题讨论】:

  • 你为什么不使用namelist ::= Namenamelist ::= namelist , Name规则?

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


【解决方案1】:

这是一个简单的:

parlist ::= Name
parlist ::= ...
parlist ::= Name , parlist

这是一个稍微不那么简单的方法,它具有左递归的优点:

parlist ::= namelist
parlist ::= namelist , ...
parlist ::= ...
namelist ::= Name
namelist ::= namelist , Name

使用人工namelist1 非终结符对语法进行相当人为的扭曲,看起来像是从 LL 语法中取出的,这只会造成问题。 (它也没有使语法为 LL(1),尽管通过左分解上面的第一个替代方案很容易做到这一点。)

【讨论】:

    【解决方案2】:

    这是一个没有冲突的野牛语法。它是 LALR(1),所以它也是 LR(1):

    %token ELIPSES COMMA NAME
    %%
    parlist : namelist parlistsuffix
            | ELIPSES
            ;
    parlistsuffix: COMMA ELIPSES
            | /* epsilon */
            ;
    namelist: namelist COMMA NAME
            | NAME
            ;
    

    【讨论】:

      猜你喜欢
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      相关资源
      最近更新 更多