首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPPG (bison) -如何实现“表达式”概念

GPPG (bison) -如何实现“表达式”概念
EN

Stack Overflow用户
提问于 2011-05-31 13:34:13
回答 1查看 768关注 0票数 0

我们正在使用GPPG (本质上是C#的bison )来为编程语言生成解析器。一切都很顺利,除了一个非常糟糕的地方。我们正在分析的语言有一种“隐式比较”规则,其中"expression expression“应该解释为"expression == expression”。

例如,这是一个完全有效的语句:

代码语言:javascript
复制
 If SomeValue False Then
 EndIf

这显然会在解析器生成过程中引入各种冲突。我第一次尝试解决这些问题的方法是这样的(为了简明起见进行了编辑)。我试图对规则进行一些重构,它似乎不再模棱两可,但我肯定遗漏了一些明显的东西。

这里有一个很小的语法,它显示了我遇到的冲突,以及我如何尝试解决它,但不起作用

代码语言:javascript
复制
%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;

%%

任何帮助都将不胜感激

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-31 13:46:41

这样如何:

代码语言:javascript
复制
program: expression;

expressionBase: Constant
    | expressionBase Plus expressionBase
    | expressionBase Times expressionBase;

expression: expressionBase 
    | expressionBase expression;

你需要自下而上地构建语法,而不是将低级概念(如expressionBase)和高级概念(如expression)混合在一起。高级别的是用低级别的构建的。如果你需要的是另一种方式,你必须用括号或类似的东西来清楚地界定高级概念,如下所示:

代码语言:javascript
复制
expressionBase: Constant
    | expressionBase Plus expressionBase
    | expressionBase Times expressionBase
    | LeftParen expression RightParen;

实际的规则是相当复杂的,但这应该是你的入门。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6183400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档