1

私の問題は、渡されたメッセージyyerrorがすでにフォーマットされており(つまり、実際には何がうまくいかなかったのか英語の説明です)、取得したいのは現在のトークン(つまり、エラー疑似トークンの前のトークン)だけです。

それで、それを取得する方法は?

私はC#のlex/yacc実装であるgplex/gppgを使用しています。


100%正確ではないことをお詫びします。必要なのは、(トークンによって)一致した本文(テキスト)ではなく、トークン(シンボル)です。

[A-Za-z0-9_]+ルールがを構成しているとしましょうIDIDだから私はトークンではなくトークンを取得したいと思いますfoobar

4

2 に答える 2

2

yyerrorが再定義された、私の古いプロジェクトでこれを見つけました。

int yyerror (char *msg) {
  printf("oha, %s: '%s' in line %d\n", msg, yytext, yylineno);
  return 0;
}

これはflex/bisonを使用したc++プロジェクトであり、yytextで見つけることができると思う興味深いものです。

于 2012-11-06T20:12:25.643 に答える
1

標準はありませんが、bisonとyaccのほとんどのバージョンは、現在のトークンをに格納しますyychar。残念ながら、これは一般に(の)ローカル変数であるため、パーサーアクションでのみ、yyparse他の関数(など)でアクセスすることはできません。yyerror

現在のトークンが必要な理由を言うと役立つ場合があります。これは通常、有用な情報ではありません。エラー疑似トークンについて言及しましたが、これはエラー回復に関連しているため意味がなく、エラー自体ではありません。通常、入力からのトークンの束は破棄されています。

于 2012-11-06T22:23:25.020 に答える