1

これはほんの一例です

YACC 文法:

abc:ABC STRING NEWLINE

end:END

.

.

レックスファイル:

int lineno=1;

.

.

string [a-zA-Z]+

%%

ABC   {return ABC;}

END   {return END;}

[\n]  {lineno++;return NEWLINE;}

{string} {return STRING;}

%%

入力ファイルが次の場合、改行が発生するたびに lineno がインクリメントされます。

ABC xyz

END

yacc はこれを正常に解析します

入力ファイルが次の場合:

ABC 123

END

それは line1:syntax error を示しています

これは予想通りでした

ただし、入力ファイルが次の場合:

ABC

END

それからline2 :syntax error が表示されます

ただし、エラーは2行目ではなく1行目にあります。

正しい行番号が表示されるようにするにはどうすればよいですか?

4

2 に答える 2

3

パーサーはレクサーからトークンを受け取るまでエラーを見つけられず、それまでにNEWLINE行番号を増やしているためです。

これは実際には珍しい問題ではなく、間違った行にエラーが表示されます。;1 つの良い例は、C ソース ファイルのステートメントの最後にセミコロン ( ) を付け忘れた場合です。エラーは次の行にある可能性が高いです。

編集: Yacc でのエラー回復処理。

yacc には、errorエラー回復に使用できる特別な端末記号があります。あなたの場合、次のように使用できます。

abc:ABC STRING NEWLINE
   |error NEWLINE
   ;

errorシンボルとシンボルの間にコード ブロックを追加しNEWLINEてエラー メッセージを出力できますが、パーサーはシンボルを確認するまでエラーの存在を認識しないため、機能しない可能性がありNEWLINEます。

于 2012-10-31T07:16:54.113 に答える
0

構文エラー メッセージは、「行番号 %d 付近の構文エラー」のように保守的に表現できます。

于 2012-10-31T12:53:56.090 に答える