1

'mismatches'という変数でエラーカウントを維持しようとしています。この変数では、bisonファイルの最初の部分で宣言しています。

私のバイソン文法では、その変数に値を設定します。

次に、bisonファイルの3番目の部分で、main()関数でその値を計算します。これは0です。

私のバイソンファイルの非常に変更された/削減されたバージョン:

%{
extern "C" FILE *yyin;
extern int yylineno;
extern int yynerrs;

int yylex();

// Declare 'mismatches'
int mismatches;

%}

%error-verbose


%%

expression:
          expression ADDOP term
          {
                     cout << "Parser is now here. Going to set `mismatches` to 6";
                     mismatches = 6;
          }
          | term
          ;

%%

int  main()
{         
          // Outputs 0
          cout << mismatches;

          yyparse();

          return 1;

}

変数'mismatches'をbisonファイルのすべての部分で使用できるようにするにはどうすればよいですか?

4

2 に答える 2

3

構文エラーをカウントしたい場合、カウンターの更新を挿入する明白な場所は yyerror です。

また、使用しないでください

%{
int counter;
%}

ヘッダーを含むファイルと同じ数の「カウンター」のコピーを取得するためです。別のファイルから "counter" を表示する場合、counter という名前の別の変数を表示するため、0 を表示しても不思議ではありません。

Bison を使用している (そして十分に最近の) 場合は、次のようにすることをお勧めします。

%code provides
{
  extern int counter;

}
%code
{
  int counter;
}

または、 を使用%{...%}して宣言し (つまり、 を使用) 、2 番目の のexternに定義します (つまり、 を使用しないextern) 。%%

于 2012-10-11T07:19:39.397 に答える
2

パーサーを実行した後、次のように変数を出力したいと思います

int  main()
{         
      yyparse();
      cout << mismatches;

      return 1;
}
于 2012-10-10T19:23:09.207 に答える