0

我们正在使用 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;

%%

任何帮助将不胜感激

4

1 回答 1

1

这个怎么样:

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;

实际规则要复杂得多,但这应该可以帮助您入门。

于 2011-05-31T05:46:41.137 回答