Shift/reduce 与 args 和 kwargs 冲突 - PLY

Shift/reduce conflict with args and kwargs - PLY

我正在为类似 Python 的语言编写解析器,它允许将两种类型的参数(位置参数和命名参数)传递给函数。而且,就像在 Python 中一样,命名参数必须在 after 位置传递。 我为它写了一个语法,但是它有 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 解析的建议对我帮助不大。

除非您的其余语法有异常,否则以通常的左递归方式编写 posargs 不会产生 shift/reduce 冲突:

posargs : optionalnl languageitem
        | posargs ',' optionalnl languageitem

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