【问题标题】:Shift/reduce conflict with args and kwargs - PLY转移/减少与 args 和 kwargs 的冲突 - PLY
【发布时间】:2017-10-25 04:57:37
【问题描述】:

我正在为类 Python 语言编写解析器,它允许将两种类型的参数(位置和命名)传递给函数。而且,就像在 Python 中一样,命名参数必须在 位置之后传递。 我为它写了一个语法,但它有 shift/reduce 冲突,我什至无法想象如何用另一种方式来编写它。

这是我的语法:

optionalcomma : COMMA
              | empty

arguments : posargs
         | posargs COMMA kwargs
         | kwargs
         | empty

posargs : optionalnl languageitem
        | optionalnl languageitem COMMA posargs

kwargs : optionalnl varassign optionalcomma
       | optionalnl varassign COMMA kwargs

这里,optionalnl 是可选的换行符,languageitem 是可以作为位置参数传递的基本对象,varassign 是变量赋值规则,相当于将命名参数传递给函数。 解析器将参数传递给第一个逗号,并且不知道哪个项目(kwarg 或 posarg)将跟随逗号;那就是问题所在。而且我完全卡在这里,写不出正确的语法。

我正在使用 LALR(1) 解析器 PLY,因此使用 GLR 解析的建议对我没有多大帮助。

【问题讨论】:

    标签: python parsing bnf ply shift-reduce-conflict


    【解决方案1】:

    除非在您的其余语法中有什么不寻常的地方,否则以通常的左递归方式编写 posargs 不会产生移位/归约冲突:

    posargs : optionalnl languageitem
            | posargs ',' optionalnl languageitem
    

    就个人而言,我也会写kwargs左递归。

    【讨论】:

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