GPPG(野牛) - 如何实现“表达式表达”概念

时间:2011-05-31 05:34:13

标签: c# bison lalr gppg

我们正在使用GPPG(基本上是C#的野牛)来为编程语言生成解析器。一切都很好,除了一个非常讨厌的一点。我们正在解析的语言有一种“隐式比较”规则,其中“表达式表达式”应该被解释为“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;

%%

非常感谢任何帮助

1 个答案:

答案 0 :(得分: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;

实际规则相当复杂,但这应该让你开始。