【问题标题】:how to resolve 2+2 and 2++2 conflict如何解决 2+2 和 2++2 冲突
【发布时间】:2012-09-14 11:31:09
【问题描述】:

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

在弹性中:

pn [\+|\-]
dig [0-9]+
exp [e|E]{dig}+

.

.

.

"+"             {printf("+ detected\n");
                return PLUS_SIGN;}




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

在野牛中:

expr:
    expr PLUS_SIGN expr
      {
        $$ = $1 + $3;
        printf(" $$=%f\n",$$);
      }
    | TYPE_INT
      {     
        $$ = (int)$1;
        printf(" $$=%f\n",$$);
      }
;

问题是:

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

我怎样才能让它做加法?

【问题讨论】:

  • 在遇到一些多用途标点符号/运算符的歧义问题后,我采用了不带 (f)lex/bison/yacc 的递归方式。

标签: c parsing bison calculator lex


【解决方案1】:
{pn}?{dig}+

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

{dig}+

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

| PLUS_SIGN expr
  {
    $$ = +$2;
    printf(" $$=%f\n",$$);
  }
| MINUS_SIGN expr
  {
    $$ = -$2;
    printf(" $$=%f\n",$$);
  }

【讨论】:

    【解决方案2】:

    文法显示PLUS_SIGN的左边部分和右边部分在减少符号时具有相同的优先级。PLUS_SIGN是左组合,所以新的语法如下:

    expr: expr PLUS_SIGN expr2
          {
             $$ = $1 + $3;
             printf("$$=%f\n", $$);
          }
        | expr2
         {
            $$ = $1;
         }
    ;
    expr2: TYPE_INT
         {     
            $$ = (int)$1;
            printf(" $$=%f\n",$$);
         }
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多