我们正在使用 GPPG(本质上是 C# 的野牛)为编程语言生成解析器。一切都很好,除了一个非常讨厌的地方。我们正在解析的语言有一种“隐式比较”规则,其中“表达式表达式”应该被解释为“表达式 == 表达式”。
例如,这是一个完全有效的陈述:
If SomeValue False Then
EndIf
这显然在解析器生成期间引入了各种冲突。我第一次尝试解决它们是沿着这些思路进行的(为简洁起见进行了编辑)。我试图对规则进行一些重构,它似乎不再模棱两可了,但我一定只是遗漏了一些明显的东西。
这是一个非常小的语法,显示了我遇到的冲突,以及我如何尝试解决它,但不起作用
%start program
%token <Token> Plus
%token <Token> Times
%token <Constant> Constant
%left Plus
%left Times
%left IMPLICIT_COMPARISON
%%
program: expression;
expressionBase: Constant
| expression Plus expression
| expression Times expression;
expression: expressionBase
| expression expressionBase %prec IMPLICIT_COMPARISON;
%%
任何帮助将不胜感激