转移/减少与args和kwargs的冲突 - PLY

时间:2017-10-25 04:57:38

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

我正在为类似Python的语言编写解析器,它允许将两种类型的参数(位置和命名)传递给函数。并且,与Python一样,命名参数必须在位置之后传递。 我为它写了一个语法,但它有转移/减少冲突,我甚至无法想象如何以另一种方式写它。

这是我的语法:

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解析的建议对我没什么帮助。

1 个答案:

答案 0 :(得分:1)

除非你的其他语法中出现异常,否则以通常的左递归方式编写posargs不会产生转移/减少冲突:

posargs : optionalnl languageitem
        | posargs ',' optionalnl languageitem

就个人而言,我也会以递归方式写出kwargs