Compiler construction yacc:can';无法从lex到yacc获取yytext值

Compiler construction yacc:can';无法从lex到yacc获取yytext值,compiler-construction,yacc,Compiler Construction,Yacc,Lex文件: {Id} {yylval.strVal=yytext; cout<<yytext<<endl; return Id;} {Id}{yylval.strVal=yytext;cout要使输出显示在Lex文件中,您需要添加“yytext”是一个包含当前令牌的静态缓冲区。然后将指针传递到该缓冲区(作为yylval)这有一个相当严重的问题,即如果您的输入中有更多的令牌,这些稍后的令牌可能会覆盖先前令牌指向的同一个yytext缓冲区,因此如果您使您的解析器更复

Lex文件:

{Id}    {yylval.strVal=yytext; cout<<yytext<<endl; return Id;}

{Id}{yylval.strVal=yytext;cout要使输出显示在Lex文件中,您需要添加
“yytext”是一个包含当前令牌的静态缓冲区。然后将指针传递到该缓冲区(作为yylval)这有一个相当严重的问题,即如果您的输入中有更多的令牌,这些稍后的令牌可能会覆盖先前令牌指向的同一个yytext缓冲区,因此如果您使您的解析器更复杂,您可能会看到随机垃圾。这里的小示例没有显示此问题,因为它没有尝试重新分析d在看到“Id”标记后,再添加一个标记。

你能提供更多描述吗?至于but strVal在union中被定义…我的错,我忘了发布它了,再次感谢。关于如何避免传递字符串的静态缓冲区问题的详细解释,请参阅此问题的第二个答案@JonN:一般解决方案的问题是如果你不小心的话,可能会泄漏内存,而且总是会出现语法错误。Bison为后者提供了一些帮助,但这仍然是一个丑陋而棘手的问题。
%union{
int iVal;  
float fVal;  
char * strVal;
}; 

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