我一直在使用 PLY 为我的语言构建解析器,但是我遇到了 shift/reduce 冲突,这给我带来了一些麻烦。我的语言具有语法 ala C++ 模板的泛型类型。所以现在我有这样的规则:
expression : expression LESS expression %prec COMPARISON
expression : template
template : NAME
| NAME LESS templates GREATER
templates : template
| templates COMMA template
但是,我发现它无法解析:
a < 2
(由于显而易见的原因,这是一个问题)。以下是调试输出:
PLY: PARSE DEBUG START
State : 0
Stack : . <Token: 'NAME' 'a'>
Action : Shift and goto state 42
State : 42
Stack : NAME . <Token: 'LESS' '<'>
Action : Shift and goto state 81
State : 81
Stack : NAME LESS . <Token: 'NUMBER' '2'>
ERROR: Error : NAME LESS . <Token: 'NUMBER' '2'>
如果需要更多我的解析器,我可以提供。谢谢。
编辑:向我建议的一种解决方案是使类型成为自己的令牌。这需要做一些工作,因为我的语言不使用预处理器,包括像 C/C++ 这样的系统,但是我认为它仍然是可能的,但是我更喜欢一个仅限于语法的解决方案。