我正在使用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");};
答案 0 :(得分:1)
你试过吗
| ClassDeclList ClassDecl
而不是
| ClassDecl ClassDeclList
我记得当我以前使用CUP时解决了很多问题。