为什么我的yacc规则在这里不能减少?

时间:2012-03-13 05:46:35

标签: c parsing yacc

我正在使用YACC来完成我的编译器作业项目。我发现我的程序无法获取语法树。所以我打印出来看看发生了什么。根据我的结果,ClassDecl似乎没有减少到ClassDeclList。但我无法理解为什么......任何人都可以帮助我吗?

示例输入为:

   program ex11;
   class ab {
   }

打印出来:

    programXXXX ex11ID
    semicon abID
    RBRACEnum 
    ClassBody ClassDecl ClassDecl1 Error!

前三行是我从LEX文件打印的消息,以确保正确识别字符。

根据该信息,解析器成功将{}缩减为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 :(得分:1)

你试过吗

| ClassDeclList ClassDecl

而不是

| ClassDecl ClassDeclList

我记得当我以前使用CUP时解决了很多问题。