0

私がレモンに渡すトークンはすべて、行番号情報が添付された構造体です。

以下のsyntax_errorの定義を見てください

%name SinkParser
%token_prefix SINKPARSER_TOKEN_

%token_type {SinkParserNode*}

%extra_argument { SinkParserContext *parser_context }
%syntax_error {
  SinkParser_SyntaxError(parser_context);
}
%token_destructor { SinkParserNode_Destruct($$); }

ただし、エラーがどのファイルと行であったかを報告する方法がわかりません。すべてのトークンに関する情報がありますが、syntax_errorハンドラーで適切なトークンにアクセスするにはどうすればよいですか?

トークナイザー内の自分の場所を個別に追跡し、構文エラーを確認する必要がありますか?構文エラーが発生するまでに、トークナイザーはおそらくパーサーよりも進んでいると思います。

4

2 に答える 2

1

LALR(1)パーサーは、誤った削減を実行する可能性はありますが、プロダクションと一致しないトークンを消費(シフト)することはありません。したがって、パーサーに提供した最後のトークンは、構文エラーをトリガーしたトークンです(最後のトークンは先読みトークンです。シフトできない場合は、構文エラーです)。2つのトークンは任意の量の空白とコメントで区切られている可能性があるため、前のトークンがどこにあったかを知ることはおそらく有用です。(たとえば、コマンドにターミネーターがなく、その後に長いコメントが続く場合、エラートークンはかなり前方にある可能性があります。)

于 2013-01-09T18:29:42.990 に答える
0

はい、トークナイザーで追跡する必要があります。「グローバル」変数として、またはトークンの属性として。

于 2013-01-09T08:30:46.120 に答える