私はYACCを使用して自分のコンパイラの宿題プロジェクトを行っています。私のプログラムは構文木を得ることができませんでした。だから私は何が起こっているか見るためにそれをすべて印刷した。私の結果によると、ClassDecl
はClassDeclList
に縮小されていないようです。しかし、私はなぜ...誰かが私を助けることができるのか理解できませんか?yaccのルールをここで減らすことができないのはなぜですか?
サンプル入力は次のとおりです。
program ex11;
class ab {
}
それはとして印刷:最初の3行は、私は文字が正しく認識されていることを確認するために、私のLEXファイルから印刷されたメッセージです
programXXXX ex11ID
semicon abID
RBRACEnum
ClassBody ClassDecl ClassDecl1 Error!
。
この情報によれば、パーサは、{}
からClassBody
およびclass ab {}
からClassDecl
に減少します。そして、それはClassDeclList
に減らされません、私はここで左の再帰的文法を書いているからですか?
これは推論のための私のYACCのルールベースの一部です:
Program: PROGRAMnum IDnum SEMInum ClassDeclList
{printf("program"); $$ = MakeTree(ProgramOp,$4, MakeLeaf(IDNode,$2)); printtree($$,0);};
ClassDeclList: ClassDecl
{printf("ClassDeclList1");$$ = MakeTree(ClassOp,NullExp(),$1); printf("ClassDeclListend");};
|ClassDecl ClassDeclList
{printf("ClassDeclList2");$$ = MakeTree(ClassOp,$2,$1); printf("ClassDeclList");};
ClassDecl: CLASSnum IDnum ClassBody
{printf("ClassDecl");$$=MakeTree(ClassDefOp,$3,MakeLeaf(IDNode,$2)); printf("ClassDecl1");};
さらに多くのコードを表示できますか?例えば、「エラー! –
あなたの文法は、shift-reduceやreduce-reduceのコンフリクトや、無駄なルールに関するメッセージなどをコンパイルしませんでしたか? – Kaz