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

foo*_*oty 0 c parsing lex calculator bison

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

在flex中:

pn [\+|\-]
dig [0-9]+
exp [e|E]{dig}+
Run Code Online (Sandbox Code Playgroud)

.

.

.

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




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

在野牛:

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

问题是:

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

我怎么能让它做这个添加?

Joh*_*ica 5

{pn}?{dig}+
Run Code Online (Sandbox Code Playgroud)

不要{pn?}使用数字标记的加号或减号()部分.将它们视为两个独立的标记,+并且2.然后flex不会有任何歧义解决.

{dig}+
Run Code Online (Sandbox Code Playgroud)

相反,让野牛处理一元加减运算符.使它成为解析器的工作,而不是词法分析器.

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