首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决2+2和2++2冲突

如何解决2+2和2++2冲突
EN

Stack Overflow用户
提问于 2012-09-22 12:36:10
回答 2查看 137关注 0票数 0

在较大的程序中,我给出了以下内容(flex/bison)

在flex中:

代码语言:javascript
复制
pn [\+|\-]
dig [0-9]+
exp [e|E]{dig}+

代码语言:javascript
复制
"+"             {printf("+ detected\n");
                return PLUS_SIGN;}




{pn}?{dig}+         { printf("digit detected - %s\n",yytext);
                sscanf(yytext, "%d", (int*)&yylval);
                return TYPE_INT;}

在Bison中:

代码语言:javascript
复制
expr:
    expr PLUS_SIGN expr
      {
        $$ = $1 + $3;
        printf(" $$=%f\n",$$);
      }
    | TYPE_INT
      {     
        $$ = (int)$1;
        printf(" $$=%f\n",$$);
      }
;

问题是:

当我给2+2时,它识别2和+2,而不是2,+,2

我怎样才能让它做加法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-22 12:47:50

代码语言:javascript
复制
{pn}?{dig}+

不要将加号或减号({pn?})作为数字标记的一部分。将它们视为两个独立的令牌,+2。那么flex就不会有任何歧义需要解决了。

代码语言:javascript
复制
{dig}+

相反,让bison处理一元加号和减号运算符。让它成为解析器的工作,而不是词法分析器的工作。

代码语言:javascript
复制
| PLUS_SIGN expr
  {
    $$ = +$2;
    printf(" $$=%f\n",$$);
  }
| MINUS_SIGN expr
  {
    $$ = -$2;
    printf(" $$=%f\n",$$);
  }
票数 4
EN

Stack Overflow用户

发布于 2012-09-22 16:45:54

当reducing symbol.The PLUS_SIGN是左组合时,语法显示PLUS_SIGN的左部分和右部分具有相同的优先级,因此新的语法如下:

代码语言:javascript
复制
expr: expr PLUS_SIGN expr2
      {
         $$ = $1 + $3;
         printf("$$=%f\n", $$);
      }
    | expr2
     {
        $$ = $1;
     }
;
expr2: TYPE_INT
     {     
        $$ = (int)$1;
        printf(" $$=%f\n",$$);
     }
;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12540757

复制
相关文章

相似问题

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