我正在为一种相当简单的语言编写解析器。该语言将允许描述具有房间的游戏。客房包含"字符"和"事物"。角色有"选项"允许你与他们互动;在开始与characrter交互后,options可以形成一个允许多个分支的树。
我经历了几次迭代并询问了一些问题,并最终让我的解析器进行编译。但是当我在一个示例输入上运行它时,我得到了语法错误,没有指出错误在哪一行。
我使用了google-fu并找到了标志 - 应该生成代码的地点 - 将使yylloc充满当前行号。
但是当我打开那面旗帜时,我就开始了 "请求成员'str'在非结构或联合的情况下" 消息。
关闭标志后,我的解析器会编译,但不会告诉我语法错误在哪里。
如何在不破坏我的%union和我的{语义代码...}之间的连接的情况下获取yylloc中的位置信息?
我的来源和make的日志是: http://apdamien.info/code/GHparser.zip
答案 0 :(得分:1)
如果您只想要行号信息,请在(f)lex文件中指定%option yylineno
,并在yacc / bison文件中声明extern int yylineno
。 flex会自动填写yylineno
。如果你想要完整的行号/列信息,就像在yylloc
结构中一样,并且你希望它与每个令牌相关联,你可以使用@n
在野牛中获取它,那么你将不得不这样做(很多)更多的工作,因为flex不会填充(甚至计算)列数。
所以--bison-bridge
没有做你认为它做的事情,它可能不会做你想要的。也许谷歌把你带到了 Taco Joe的Enchiladas和Flex Misconceptions 的页面而不是appropriate section of the Flex manual,或者它可能只是把你带到了appendix on bison-bridge你我需要非常仔细地阅读,因为尽管--bison-locations
确实改变了yylex
的调用约定,但重要的区别并没有得到强调。
也许flex文档假设人们会理解编译器错误,如果他们使用这个选项而不调整他们的flex操作就必然会产生错误。
无论如何,重点是:
请注意,宏'yylval'和'yylloc'计算为指针。
换句话说,当您指定--bison-bridge
(或--bison-locations
。暗示--bison-bridge
)时,yylval
不再是全局变量;相反,使用指针调用yylex
到语义值对象,yylval
因此类型为YYSTYPE*
而不是YYSTYPE
。这意味着您需要更改flex动作中yylval
的任何使用,例如
yylval.str = strdup(yytext);
到
yylval->str = strdup(yytext);
(顺便说一句,如果您的操作显示为yylval.str = yytext;
,则需要搜索问题的多个SO答案之一,例如“为什么我的令牌的字符串值会在解析器中发生变化?”或者阅读this bison FAQ。或者您可以像上面一样使用strdup
,但我有一个老式的想法,即应该理解使用的工具,而不是盲目地复制来自匿名陌生人的代码。)