我有一个包含一系列规则的复杂的Yacc文件,其中有些规则很复杂,例如:
start: program
program: extern_list class
class: T_CLASS T_ID T_LCB field_dec_list method_dec_list T_RCB确切的规则和我对它们采取的操作并不重要,因为我想要做的事情看起来相当简单:只要在源文件中打印出程序,就可以使用我为其他目的定义的规则。但我对这么做有多困难感到惊讶。
首先,我尝试将printf("%s%s", $1, $2)添加到上面的第二条规则中。这就产生了“��@P�”。据我所知,解析的文本也可以作为变量yytext使用。我将printf("%s", yytext)添加到文件中的每个规则中,并将extern char* yytext;添加到文件的顶部。这将根据语言的语法从有效文件中生成(null){void)1133331122222210101010--552222202020202222;;;;||||&&&&;;;;;;;;;;}}}}}}}}。最后,我将extern char* yytext;改为了extern char yytext[],认为这没有什么区别。它所产生的输出差异最好用屏幕截图来显示。

我在Xubuntu 14.04上使用Bison3.0.2。
发布于 2016-03-07 02:47:12
如果您只想在解析时将源回显到某个输出,那么在lexer中这样做是最简单的。您并没有说您对lexer使用了什么,但是您提到了yytext,它是由lex/flex使用的,所以我将假设这一点。
当您使用flex识别令牌时,变量yytext引用了内部缓冲区flex用于识别令牌的方法。在令牌的操作中,它可以用于获取令牌的文本,但只能暂时使用--一旦操作完成并读取下一个令牌,它将不再有效。
所以,如果你有一个灵活的规则,比如:
[a-zA-Z_][a-zA-Z_0-9]*    { yylval.str = yytext, return T_ID; }这很可能根本不起作用,因为你的程序中会有悬空的指针在运行;可能是你看到的随机输出的来源。相反,你需要复制一份。如果您还想不修改地输出输入,也可以在这里这样做:
[a-zA-Z_][a-zA-Z_0-9]*    { yylval.str = strdup(yytext); ECHO; return T_ID; }这使用了flex宏ECHO,大致相当于fputs(yytext, yyout) --将输入复制到名为yyout (默认为stdout)的FILE *中。
https://stackoverflow.com/questions/35835192
复制相似问题