首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以为在Bison中定义为非终端的运算符定义运算符优先级?

是否可以为在Bison中定义为非终端的运算符定义运算符优先级?
EN

Stack Overflow用户
提问于 2021-08-23 14:55:10
回答 1查看 35关注 0票数 0

我还没能找到一个解决方案来为我现有的语法规则应用运算符优先级。这些操作涉及一元运算符和二元运算符,如+、-、*等。这些运算随后被视为表达式。

我掌握的语法/优先级规则如下(以大写单词为标记):

代码语言:javascript
运行
复制
%left PLUS MINUS
%left MUL DIV
%left UMINUS NOT

expr    : expr binop expr           {$$ = new BinOpExpression($1, $3, $2);}
        | NOT expr                  {$$ = new UnaryBooleanNegationExpression($2);}
        | MINUS expr %prec UMINUS   {$$ = new UnaryNumericNegationExpression($2);}
        | LPAREN expr RPAREN        {$$ = $2;}
        ;

binop
    : PLUS  { $$ = new Add(); }
    | MINUS { $$ = new Sub(); }
    | MUL   { $$ = new Mul(); }
    | DIV   { $$ = new Div(); }
    | GT    { $$ = new GreaterThan(); }
    | GE    { $$ = new GreaterOrEqual(); }
    | ...
    ;

这样做的问题是,优先级规则仅应用于一元减号运算符。例如,我的编译器为表达式"1+-2*3-8“返回的解决方案是11,而不是-13。表达式的计算结果为(前缀表示法):

代码语言:javascript
运行
复制
+(
  1,
  *(
    -2,
    -(3, 8)
   )
 )

这表明运算符是按照找到它们的顺序应用的。为了解决这个问题,我为每个运算符添加了一个新规则expr (如下所示),从而解决了这个问题:

代码语言:javascript
运行
复制
expr    : expr PLUS expr            {$$ = new BinOpExpression($1, $3, new Add());}
        | expr MINUS expr           {$$ = new BinOpExpression($1, $3, new Sub());}
        | expr MUL expr             {$$ = new BinOpExpression($1, $3, new Mul());}
        | expr DIV expr             {$$ = new BinOpExpression($1, $3, new Div());}
        | ...
        ;

但我想避免这种情况,因为为了添加正确的运算符优先级,我必须将1个规则(例如expr binop expr)转换为19个不同的规则(每个一元、二进制和赋值操作一个)。有没有办法避免这种情况,同时仍然获得正确的运算符优先级?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-23 16:47:54

您看到的基本问题是每个规则只能有一个优先级,那么规则expr: expr binop expr的优先级应该是什么呢?因此,每个优先级都需要至少有一条规则。你可以这样做:

代码语言:javascript
运行
复制
expr : expr addop expr %prec PLUS
     | expr mulop expr %prec MUL
     ...

addop : PLUS | MINUS
mulop : MUL | DIV

这不需要太多的expr规则,但并不比为每个运算符使用单独的规则更简单。

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

https://stackoverflow.com/questions/68894825

复制
相关文章

相似问题

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