Lex / Flex:为什么我会得到"错误:请求成员'str'不是结构或联合"使用时 - 位置

时间:2016-04-29 18:11:04

标签: bison yacc lex

我正在为一种相当简单的语言编写解析器。该语言将允许描述具有房间的游戏。客房包含"字符"和"事物"。角色有"选项"允许你与他们互动;在开始与characrter交互后,options可以形成一个允许多个分支的树。

我经历了几次迭代并询问了一些问题,并最终让我的解析器进行编译。但是当我在一个示例输入上运行它时,我得到了语法错误,没有指出错误在哪一行。

我使用了google-fu并找到了标志 - 应该生成代码的地点 - 将使yylloc充满当前行号。

但是当我打开那面旗帜时,我就开始了 "请求成员'str'在非结构或联合的情况下" 消息。

关闭标志后,我的解析器会编译,但不会告诉我语法错误在哪里。

如何在不破坏我的%union和我的{语义代码...}之间的连接的情况下获取yylloc中的位置信息?

我的来源和make的日志是: http://apdamien.info/code/GHparser.zip

1 个答案:

答案 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,但我有一个老式的想法,即应该理解使用的工具,而不是盲目地复制来自匿名陌生人的代码。)