2012-03-13 6 views
0

私はYACCを使用して自分のコンパイラの宿題プロジェクトを行っています。私のプログラムは構文木を得ることができませんでした。だから私は何が起こっているか見るためにそれをすべて印刷した。私の結果によると、ClassDeclClassDeclListに縮小されていないようです。しかし、私はなぜ...誰かが私を助けることができるのか理解できませんか?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");}; 
+1

さらに多くのコードを表示できますか?例えば、「エラー! –

+0

あなたの文法は、shift-reduceやreduce-reduceのコンフリクトや、無駄なルールに関するメッセージなどをコンパイルしませんでしたか? – Kaz

答えて

1

あなたは

| ClassDeclList ClassDecl 

代わりの

| ClassDecl ClassDeclList 

を試みたことがありますか?

私はCUPを使用していたときにこれが多くの問題を修正したことを覚えています。

+0

はい、それは働いたが、私はなぜ理解できないのですか? yaccは左回帰文法を使う方が効率的だろうと思った? – faz

+0

私は本当にここでお手伝いしません、私は理論的なコンパイラのコースを勉強してからそれは長いです。しかし、これはLRパーサーの仕組みと関係しています。私は大学の実用的なコンパイラコースを教えていたので、この修正は専門知識ではありません...実際の理解ではありません:-D – OmarOthman

+1

これはナンセンスです。 (まず@faz、あなたの文法は残っていない正しい再帰的です)パターンに沿って正しい再帰的規則を持つパーサーがあります:LIST:ATOM | ATOM LIST; '。彼らは正常に動作します。私の行動はこのようなことをしているので、正しい再帰的な仕事は 'LIST:ATOM {$$ = cons($ 1、nil); }; 'と' LIST:ATOM LIST {$$ = cons($ 1、$ 2); } '。 Lispのようなリストは右回帰的なものなので、文法は次の通りです。 – Kaz

関連する問題