1
1
所以我花了相当长的时间仔细检查语法(和bison输出),看不出这里有什么明显的错误。如果没有执行它的手段,我就不能通过实验很容易地弄清楚到底发生了什么。因此,下面是我在调试语法时通常要经历的一些具体步骤。希望你可以做任何你还没有做过的事情,然后可能会发布后续(或编辑你的问题)的任何结果,可能会揭示:
查看错误输出的结构-“+”被识别为标识符标记,因此被查找为符号。也许值得检查一下lexer,看看它是如何处理标识符标记的。你可能只是不小心抓得太多了。作为一种进一步的调试技术,您可以考虑将其中的一些标记文字(例如,“+”、“{”等)转换为真正的标记,以便bison的错误报告可以为您提供更多帮助。 编辑:好吧,我越是深入研究它,我就越相信lexer不一定能正常工作。在继续下一步之前,我将再次检查您从yylex()获得的令牌流是否符合您的期望。特别是,一些正则表达式捕获了一堆您认为特殊的符号(例如“+”和“{”)或者至少允许传递标识符。 |
2
2
|
3
1
你不会因为你的规则使用
在经典的Yacc中,您会发现,如果嵌套足够深,堆栈空间就会耗尽
正确递归的一个结果是,在读取链中的最后一个对象名(或者更准确地说,在该名称之后的一个符号)之前,不会发生缩减。我看到你用了正确的递归
|
4
1
我认为你的主要问题是你没有定义一个子树构造函数 对象 您可能还需要按遇到的顺序查找对象。 也许你打算:
我假设如果一个人遇到一个标识符X本身,你的默认解释 它是一个变量名。但是,如果遇到X->Y、 那么即使X 是一个变量名,您需要 对象 最左边的 遇到标识符以查看它是否为变量 或者查看它是否是有效的对象名,并返回标记为AST\u OBJ的AST节点, 或者如果标识符不是其中之一就抱怨。 LookupSubject所做的是检查其左操作数以确保它是AST\ OBJ (或名称恰好与对象的名称相同的AST\u VAR)。 如果不是,就抱怨。如果是,那么它将查找的yytext子对象 命名为AST_OBJ。 编辑:基于另一个答案中的讨论评论,右递归在OP的原始 这个解决方案是递归的,不会与特定的陷阱相冲突。 |
5
0
id\U查找 :标识符 在形式上与 对象名称 :标识符 而object\u name会接受id\u lookup不会接受的所有内容,所以assertLookup(yytext);可能运行在所有看起来像标识符的东西上,而其他规则不接受这些东西,只是为了在2之间做出决定,然后object\u name不能接受,因为单个lookahead禁止这样做。 对于twilight区域,您得到错误的两个字符没有声明为标记,而opends是未定义行为的区域,当语法松动时,解析器可能会尝试将它们视为潜在的标识符。 |
6
0
我刚刚试着用bison2.4.1在ubuntu10.04中运行muscl,我能够运行你的两个例子,没有语法错误。我猜你的野牛版本里有个虫子。如果我运行的解析器有问题,请告诉我。下面是您给出的第一个示例的输出。
|
Kris · Flex-新行无法识别 7 年前 |
omn_1 · yylineno为错误报告提供意外结果 7 年前 |
lluisrojass · 为什么Yacc/野牛规则没有用? 7 年前 |
gornvix · 分析多个文件时出现错误的lex状态 9 年前 |
Jason Kleban · 语法规范解决移位/减少冲突 12 年前 |
footy · 如何解决2+2和2++2冲突 12 年前 |
KAction · Bison意外的标识符错误 12 年前 |