2010-11-19 9 views
1

私のコードのクラスセクションで、私がエラーを書き込むと、いくつかの行がエラーとして報告されます。私は '| error'を、エラーから回復するのが良い/安全な特定の場所に配置しましたが、私はそれを使用しているとは思わない。たぶん、途中で表現を再開しようとしているのでしょうか?bison:1つのエラーで追加の間違ったエラーが発生する

Bisonに指定場所での回復を強制する方法はありますか?どのように機能し、何が間違っているのでしょうか?

エラー行をループの隣に置きます。次に例を示します。ここでは

SomeRuleLoop: 
    | Rule ',' SomeRuleLoop 
Rule: 
     A 
    | B 
    | C 
    | Error 
A: 
     AA AAB AABC 
    | AA AAB AABC Z 
... 

は私のルールの一例です。私のコンソールで "funcBodyエラー"が表示されますが、最初のエラーのため次の行に​​エラーが発生します。各funcBodyRuleはスタンドアロンですが。

funcBodyLoop: 
    | funcBodyLoop funcBody 

funcBody: 
     funcBodyRule 
    | error { printf("funcBody error"); $$=0; } 
    | '#' EQ { printf("still in funcBody\n"); $$=0; } 

最初のエラーの行と2番目の行の間に#==を書きました。パーサがまだfuncbodyループにあるかどうかをチェックするためにこれを書きました。 これはエラーを起こさないので、 です。 Nevermind私はprintfを追加し、文字列isntが印刷されたので、おそらくそれは関数のループにはもうありませんか?どのように私はこれを修正するのですか?

+0

私たちを助けるいくつかのコードなしでは、ほとんど助けが不可能に近いだろう。 **しかし、**それは数百行ではなく、最小限のコードに近い必要があります。 –

+0

@Jonathan Leffler:そのループの場所です。私は自分の質問を変更しました –

+0

Yacc(Bison)は大文字と小文字を区別しているので、 'Error'の代わりに 'error'( '組み込み'で特定の意味のw.r.tエラー回復)がありません。 –

答えて

0

が強制「;」またはエラーの終わりに改行がそれを解決します。 (の代わりに| error my_end_of_statenent

1

通常、YaccとBisonは左回帰規則を使用し、表示された規則は左回帰ではありません。

示すように、最初のルールは、と等価である:

SomeRuleLoop: 
     /* Nothing */ 
    | Rule ',' SomeRuleLoop 
    ; 

これは「SomeRuleLoop」はトークンの空の文字列または続く「ルール」のいずれかであることを言う右再帰ルールでありますカンマといくつかの 'SomeRuleLoop'。これは、 'SomeRuleLoop'がコンマで終わっていることを意味していることに注意してください。

最初のルールは、おそらく次のようになります。空の選択肢を可能にすることが重要であることに注意してください

SomeRuleLoop: 
     Rule 
    | SomeRuleLoop ',' Rule 
    ; 

を -


(以上シフト/競合を減らす)が、どこでも、それらを追加すると、文法が曖昧にする傾向があります

また、エラー回復が発生する可能性のあるポイントを示すには、「エラー」(大文字と小文字が混在する)ではなく「エラー」(小文字すべて)トークンを使用する必要があります。

しかし、私はあなたの悩みの残りの部分が何であるかわからないんだけど...

+0

待って待って...あなたの冗談です。その左回帰?正しく再帰しない? Yikes、私はこれを間違ってやっている。それはエラーの問題を解決する可能性があります。私はすべてを固定したときに私はコメントします –

+0

私はかなり混乱しています。再帰的に残すようにルールを修正しました。エラーメッセージが表示されています。しかし、私はまだエラーが発生します。私は質問を更新した –

関連する問題