2

エラーが発生した行番号を出力するにはどうすればよいですか。関数で使用yylinenoしてファイルに書き込もうとしましたが、コンパイル後にエラー " " が表示され、1 として初期化すると次のエラーが表示されます。yyerror()%option yylineno.lyylineno undeclared (first use in this function)yylineno

error: redefinition of yylineno
lex.yy.c:273: note: previous definition of yylineno was here
4

2 に答える 2

2

グローバル変数 yylineno を提供するように flex に要求する 2 つ目の方法があります: コマンドライン スイッチ-lです。それがうまくいかない場合は、Levine et al. のように、独自のグローバルを管理できます。提案します。改行に一致するすべてのルールでそれを増やします。

%{
    int mylineno = 1;
%}
%%
* * * 
\n  { mylineno++; }
于 2012-09-23T03:20:36.373 に答える
1

問題が発生する可能性のある方法はいくつかありますが、どれが関連しているかを推測するのは困難です。

  1. Flex ソース (.lファイルとソースから作成されたオブジェクト ファイル) で定義された変数がありますが、Bison 文法 (.yファイル) またはヘッダーで宣言していないため、文法をコンパイルするときに宣言されていません。

  2. 文法で宣言されていますが、それでも問題が発生します。文法または語彙アナライザーから生成されたファイル内のフラグメントの順序は、予期した.cものとは異なる場合があるため、宣言される前に変数を参照することになります。それを参照するコードは、ブロックに表示される%{ ... %}場合、2 番目の%%セクション マーカーの後に表示される場合、文法 (または語彙アナライザー) アクション ブロックの 1 つに表示される場合、またはソース内の他の場所に表示される場合があります。これらのそれぞれがyylineno変数がブロック内に (できればヘッダーを介して) 純粋な宣言を持っている場合、コードは問題ないはずです。重複を排除しようとしますが、同じことを繰り返すリスクがありますが (ヘッダーがべき等であれば大きな問題にはなりません)、すべての適切なセクションで宣言されていることを確認できます。

デフォルトでは、文法には語彙アナライザーからの情報が含まれていないことに注意してください。共有情報が適切に宣言および定義されていることを確認する必要があります。

于 2012-09-23T07:43:16.957 に答える