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 ^ _ ^
答案 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代码?如果没有,那就这样做吧!如果您这样做,请编辑问题中的代码以准确反映您所拥有的内容;我们无法从互联网的这一面阅读您的屏幕。