【发布时间】: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