首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我怎样才能打印我在雅克/野牛身上看到的东西?

我怎样才能打印我在雅克/野牛身上看到的东西?
EN

Stack Overflow用户
提问于 2016-03-07 02:20:32
回答 2查看 3.7K关注 0票数 0

我有一个包含一系列规则的复杂的Yacc文件,其中有些规则很复杂,例如:

代码语言:javascript
复制
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。

EN

Stack Overflow用户

回答已采纳

发布于 2016-03-07 02:47:12

如果您只想在解析时将源回显到某个输出,那么在lexer中这样做是最简单的。您并没有说您对lexer使用了什么,但是您提到了yytext,它是由lex/flex使用的,所以我将假设这一点。

当您使用flex识别令牌时,变量yytext引用了内部缓冲区flex用于识别令牌的方法。在令牌的操作中,它可以用于获取令牌的文本,但只能暂时使用--一旦操作完成并读取下一个令牌,它将不再有效。

所以,如果你有一个灵活的规则,比如:

代码语言:javascript
复制
[a-zA-Z_][a-zA-Z_0-9]*    { yylval.str = yytext, return T_ID; }

这很可能根本不起作用,因为你的程序中会有悬空的指针在运行;可能是你看到的随机输出的来源。相反,你需要复制一份。如果您还想不修改地输出输入,也可以在这里这样做:

代码语言:javascript
复制
[a-zA-Z_][a-zA-Z_0-9]*    { yylval.str = strdup(yytext); ECHO; return T_ID; }

这使用了flex宏ECHO,大致相当于fputs(yytext, yyout) --将输入复制到名为yyout (默认为stdout)的FILE *中。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35835192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档