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

时间:2011-01-05 01:35:59

标签: compiler-construction yacc

Lex档案:

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

Yacc文件:

%union{
int iVal;  
float fVal;  
char * strVal;
}; 

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

Lex打印,但Yacc没有!!

想法ppl ^ _ ^

2 个答案:

答案 0 :(得分:1)

'yytext'是一个包含当前令牌的静态缓冲区。然后,您将指针传递到该缓冲区(作为yylval)到解析器。这有一个相当严重的问题,即如果输入中有更多令牌,这些后来的令牌可能会覆盖先前令牌指向的相同yytext缓冲区,因此如果使解析器更复杂,您可能会开始看到随机垃圾。这里的简单示例没有显示此问题,因为在看到“Id”令牌后它不会尝试读取另一个令牌。

答案 1 :(得分:0)

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

您的Lex代码分配给yylval.strVal,但您的Yacc语法未将strVal定义为%union的一部分。如果代码正在编译,则表示在使用标头时某处存在断开连接。您的Lex代码应使用Yacc生成的标头(yacc -d)。


由于联合已解决,并且确认添加<< endl到Lex代码显示输出,您是否还考虑将<< endl添加到Yacc代码?如果没有,那就这样做吧!如果您这样做,请编辑问题中的代码以准确反映您所拥有的内容;我们无法从互联网的这一面阅读您的屏幕。