如何解决2 + 2和2 + 2冲突(how to resolve 2+2 and 2++2 conf

2019-07-31 19:25发布

在更大的程序我已经给出了以下的(弯曲/野牛)

在柔性:

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

我怎样才能得到它做加法?

Answer 1:

{pn}?{dig}+

不要让加号或减号( {pn?}的数量令牌的一部分。 把它们作为两个单独的代币, +2 。 然后弯曲不会有任何歧义来解决。

{dig}+

相反,有野牛处理一元加号和减号运营商。 让它解析器的工作,而不是词法分析器的。

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


Answer 2:

语法显示左部和PLUS_SIGN的右侧部分具有减少symbol.The PLUS_SIGN留下组合,所以新的语法低于当相同的优先级:

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


文章来源: how to resolve 2+2 and 2++2 conflict