我们正在使用GPPG (本质上是C#的bison )来为编程语言生成解析器。一切都很顺利,除了一个非常糟糕的地方。我们正在分析的语言有一种“隐式比较”规则,其中"expression expression“应该解释为"expression == expression”。
例如,这是一个完全有效的语句:
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;
%%任何帮助都将不胜感激
发布于 2011-05-31 13:46:41
这样如何:
program: expression;
expressionBase: Constant
| expressionBase Plus expressionBase
| expressionBase Times expressionBase;
expression: expressionBase
| expressionBase expression;你需要自下而上地构建语法,而不是将低级概念(如expressionBase)和高级概念(如expression)混合在一起。高级别的是用低级别的构建的。如果你需要的是另一种方式,你必须用括号或类似的东西来清楚地界定高级概念,如下所示:
expressionBase: Constant
| expressionBase Plus expressionBase
| expressionBase Times expressionBase
| LeftParen expression RightParen;实际的规则是相当复杂的,但这应该是你的入门。
https://stackoverflow.com/questions/6183400
复制相似问题