我正在为类似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解析的建议对我没什么帮助。
答案 0 :(得分:1)
除非你的其他语法中出现异常,否则以通常的左递归方式编写posargs
不会产生转移/减少冲突:
posargs : optionalnl languageitem
| posargs ',' optionalnl languageitem
就个人而言,我也会以递归方式写出kwargs
。