gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:58:30 25 4
gpt4 key购买 nike

我正在使用 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");};

最佳答案

你试过吗

| ClassDeclList ClassDecl

而不是

| ClassDecl ClassDeclList

我记得这解决了我以前使用 CUP 时的许多问题。

关于c - 为什么我的 yacc 规则不能在这里减少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9678972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com