1

true nor true nor (false nor false)Flex や Bison を使用するなど、nor 式の電卓を実装しようとしていますが、エラー メッセージが何度も返されます。ここに私の.lファイルがあります:

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

%% 
("true"|"false")    {return BOOLEAN;}

.|\n    {yyerror();}

%%

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

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

ここに私の.yファイルがあります:

/* Bison declarations.  */
 %token BOOLEAN
 %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;           }
 ;
 %%

誰かが問題を見ていますか?

4

2 に答える 2

1

すべての単一文字トークンを処理する簡単な方法は、まだまったく処理していないと @vitaut が正しく言っているようyytext[0]に、ドット規則に戻り、パーサーにどれが合法であるかを分類させることです。

また、BOOLEAN の 'true' と 'false' の値を失いました。これらは、それぞれ 1 と 0 として yylval に格納される必要があり$1, $3ます。 、%unionディレクティブを調べる必要があります。

于 2013-02-28T06:13:09.403 に答える
1

エラーが発生する理由は、レクサーが 1 つのタイプのトークン、つまり のみを認識BOOLEANし、改行、括弧またはnor(およびその他すべてに対してエラーを生成する) を認識しないためです。括弧や改行などの単一文字トークンの場合、文字自体をトークン タイプとして返​​すことができます。

\n { return '\n'; }

思考のために、norあなたがしたようにトークンタイプを導入BOOLEANし、レクサーに適切なルールを追加する必要があります。

于 2013-02-28T05:52:45.163 に答える