0

大規模なプログラムでは、次のように指定しました(フレックス/バイソン)

フレックス:

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 が認識されます

追加を行うにはどうすればよいですか?

4

2 に答える 2

4
{pn}?{dig}+

{pn?}プラス記号またはマイナス記号 ( ) を数値トークンの一部にしないでください。それらを 2 つの別個のトークンとして扱い+2. そうすれば、flex には解決すべきあいまいさがなくなります。

{dig}+

代わりに、bison に単項プラスおよびマイナス演算子を処理させます。レクサーの仕事ではなく、パーサーの仕事にしましょう。

| PLUS_SIGN expr
  {
    $$ = +$2;
    printf(" $$=%f\n",$$);
  }
| MINUS_SIGN expr
  {
    $$ = -$2;
    printf(" $$=%f\n",$$);
  }
于 2012-09-22T04:47:50.193 に答える
1

文法は、シンボルを削減するときにPLUS_SIGNの左部分と右部分が同じ優先度を持つことを示しています。PLUS_SIGNは左の組み合わせであるため、新しい文法は次のとおりです。

expr: expr PLUS_SIGN expr2
      {
         $$ = $1 + $3;
         printf("$$=%f\n", $$);
      }
    | expr2
     {
        $$ = $1;
     }
;
expr2: TYPE_INT
     {     
        $$ = (int)$1;
        printf(" $$=%f\n",$$);
     }
;
于 2012-09-22T08:45:53.730 に答える