1

FlexとBisonを使用してnor計算機を作成しています。これが私の.lファイルです:

%{
#include <stdlib.h>
#include "y.tab.h"
%}

%% 
("true"|"false")    {return BOOLEAN;}
"nor"               {return NOR;}
.                   {return yytext[0];}

%%

int main(void)
{
    yyparse();
    return 0;
}

int yywrap(void)
{
     return 0;
}
int yyerror(void)
{
    getchar();
    printf("Error\n");
}

これが私の.yファイルです:

/* Bison declarations.  */
 %token BOOLEAN
 %token NOR
 %left 'nor'

 %% /* The grammar follows.  */
 input:
   /* empty */
 | input line
 ;

 line:
   '\n'
 | exp '\n'  { printf ("%s",$1); }
 ;

 exp:
   BOOLEAN            { $$ = $1;           }
 | exp 'nor' exp      { $$ = !($1 || $3);  }
 | '(' exp ')'        { $$ = $2;           }
 ;
 %%

問題は、「trueまたはfalse」などの入力を入力すると、レクサーがに到達しreturn BOOLEAN、次にreturn yytext[0]、エラーをスローすることです(フレックスコードで)。誰かが何が悪いのかわかりますか?

4

2 に答える 2

1

問題はここにあります:

%left 'nor'

exp:
   BOOLEAN            { $$ = $1;           }
 | exp 'nor' exp      { $$ = !($1 || $3);  }
 | '(' exp ')'        { $$ = $2;           }
 ;

ターミナルトークンとして記述'nor'した場合、パーサーは「または」をトークンとして認識できないためNOR、レクサーが返すようにこれを次のように置き換える必要があります。

"nor"               {return NOR;}

解決

    %left NOR

and 

    exp:
       BOOLEAN            { $$ = $1;           }
     | exp NOR exp      { $$ = !($1 || $3);  }
     | '(' exp ')'        { $$ = $2;           }
     ;
于 2013-02-28T16:02:56.503 に答える
0

レクサーは空白も認識する必要があります。別のルールを作成します""。アクションは必要ありません

于 2013-02-28T15:14:17.837 に答える