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
左递归。
我正在为类似 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
左递归。