2011-07-23 6 views
1

ASTを分析した後、ルールが完了したときにエラーがあるかどうかを知る特定のケースがあります。私は運がないyyerror( "blah")を試しました。bisonに構文エラーがあると私にどのように伝えますか?

エラーがあるので、別のルールが終了し、現在ではreduce/reduceの競合が発生していると伝えられないためです。これは迷惑なものです。なぜなら、それらのうちの1つが他のものを見ることなく無効であるが、ユーザーはbcに苦しんでいるからです。このブランチを無視する方法はわかりません。

この問題を解決するにはどうすればよいですか?

答えて

2

を作成する必要がある - アクションでYYERRORを置くことは、アクション構文エラーを行い、エラー回復に行くために、パーサーを引き起こしmode(パーサーでエラー回復処置がある場合、それ以外の場合はYYABORTと多かれ少なかれ同等です)。 yyerrorは、bisonがエラーメッセージで呼び出すルーチンです。デフォルトの実装では、エラーメッセージが出力されますが、解析エラーや構文エラーは何もありません。

これは、reduce-reduce(またはshift-reduce)競合とは関係がないことに注意してください。競合はエラーではなく、LALR(1)にならない文法のものなので、bisonが生成されますパーサーはそれを確実に認識できません。

+0

(YYERRORを使用しているために到達できない状態でreduce/reduceの競合が発生した場合、それは問題にはならないことに注意してください。 – templatetypedef

+0

私の問題を解決してくれてありがとう! (私は、私が期待している種類のr/rエラー数を変更しませんが) –

0

あなたはYYERRORがないyyerrorたい削減/削減紛争のない構文

+0

これは質問に答えるものではなく、これを行うことは不可能かもしれません(たとえば、C++文法はLALR(1)ではありません)。問題は、文脈依存情報を使用してパーサーが決して正しくない可能性のある削減を試みないようにする方法を決定する方法です。 – templatetypedef

関連する問題