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

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

在flex中:

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

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

 {pn}?{dig}+ 

不要在数字标记中加上或加号( {pn?} )。 将它们视为两个独立的标记, +2 。 然后flex将没有任何歧义来解决。

 {dig}+ 

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

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

语法显示PLUS_SIGN的左侧部分和右侧部分在减少符号时具有相同的优先级.PLUS_SIGN是左组合,因此新语法如下:

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