首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >yacc:无法将yytext值从lex获取到yacc

yacc:无法将yytext值从lex获取到yacc
EN

Stack Overflow用户
提问于 2011-01-05 09:35:59
回答 2查看 1.7K关注 0票数 0

Lex文件:

代码语言:javascript
复制
{Id}    {yylval.strVal=yytext; cout<<yytext<<endl; return Id;}

Yacc文件:

代码语言:javascript
复制
%union{
int iVal;  
float fVal;  
char * strVal;
}; 

%token NS  
%token  <strVal>Id  
program : NS Id {cout<<$2;}

Lex打印,但Yacc不打印!

ideas ppl ^_^

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-05 09:44:42

要使输出出现在Lex文件中,需要在yytext及其后面的分号之间添加<< endl。否则,输出将被缓冲,直到出现换行符或文件在程序结束时关闭。

您的Lex代码将赋值给yylval.strVal,但是您的Yacc语法没有将strVal定义为%union的一部分。如果代码正在编译,这表明您在使用头的某个地方断开了连接。您的Lex代码应该使用Yacc (yacc -d)生成的头文件。

随着联合之间的脱节问题得到解决,并且确认将<< endl添加到Lex代码中显示了该输出,您是否也考虑将<< endl添加到Yacc代码中?如果不是,就这么做吧!如果您这样做了,请编辑问题中的代码以准确反映您所获得的内容;我们无法从Internet的这一端读取您的屏幕。

票数 0
EN

Stack Overflow用户

发布于 2011-01-05 14:01:38

“‘yytext”是包含当前标记的静态缓冲区。然后将一个指针传入该缓冲区(作为yylval)给解析器。这有一个相当严重的问题,如果你的输入中有更多的标记,这些后面的标记可能会覆盖之前标记指向的相同的yytext缓冲区,所以如果你让解析器变得更复杂,你可能会看到随机的垃圾。这里的简单示例没有显示这个问题,因为它在看到“Id”令牌后不会尝试读取另一个令牌。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4600117

复制
相关文章

相似问题

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