2011-07-27 23 views
5

私はYACCを学び、それが私に与えている警告メッセージを理解するのに少し苦労しています。ここに私のファイルの一部です:YACCの規則が減っていない

define_character: WORD IS STRING COLOR 
{ 
    printf("%s's full name is %s and thier color is %s", $1, $3, $4); 
}; 

dialog: WORD COLON STRING 
{ 
    printf("%s says %s", $1, $3); 
}; 

change_scene: SCENE SETSCENE WORD 
{ 
    printf("%s is the new scene", $3); 
}; 

それは私を与えることを警告は、次のとおりです。

2 rules never reduced 
2 useless nonterminals and 2 useless rules 
warning: useless nonterminal: dialog 
warning: useless nonterminal: change_scene 
warning: useless rule: dialog: WORD SEMICOLON STRING 
warning: useless rule: change_scene: SCENE SETSCENE WORD 

私はこれらをどのように修正すればよいですか?私は検索を試みましたが、シフト/競合のためにエラーが発生した人が見つかりました。 YACCは通常、警告出力に警告を出力するようですが、change_sceneからWORDを削除しようとしましたが、他のものと同じトークンを探していないことを確認しています。 。私はすべてのルールをテストすることができます。なぜなら、どちらが上にあっても動作するものがあるからです。残りの部分で問題を引き起こしている最初のルールの最後にいくつかの構文がありませんか?

答えて

3

yaccは、最初のプロダクションの左側が開始シンボルであることを前提としています。この場合、これはあなたが

define_character: WORD IS STRING COLOR 

を持っているので、yaccはdefine_characterは開始記号であると考えていることを意味しています。あなたはdialogまたはdefine_characterからchange_sceneのいずれかを導出する方法はありませんことを、しかし、他の二つの作品、すなわち

dialog: WORD COLON STRING 

change_scene: SCENE SETSCENE WORD 

お知らせがあります。その結果、yaccはあなたに2つの役に立たない非終端記号、つまりこれらの2つがあることは決してないことを伝えています。上記の両方のプロダクションが実際にパーサによってトリガされることはないため、2つの役に立たないプロダクションに関するエラーが発生します。

このコードで何をしようとしているのか分かりませんが、これを修正するには、これらの非終端記号に到達できるようにする必要があります。 yaccで達成しようとしていることを正確に説明できますか?

+0

ありがとうございます、私はそれが今修正されていると思います。私が見たすべての例は、実際には複数のアクションを処理する方法を示していませんでした。私はO'Reillyの本を持っており、私がパーサーを構築するのを試みています。私はさらに読むべきだと思います。私は視覚小説のための通訳を作っています。 |で区切られたコマンドのリストを先頭にコマンド文を置くことで修正しました。 – John

関連する問題