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不打印!
ideas ppl ^_^
发布于 2011-01-05 09:44:42
要使输出出现在Lex文件中,需要在yytext及其后面的分号之间添加<< endl。否则,输出将被缓冲,直到出现换行符或文件在程序结束时关闭。
您的Lex代码将赋值给yylval.strVal,但是您的Yacc语法没有将strVal定义为%union的一部分。如果代码正在编译,这表明您在使用头的某个地方断开了连接。您的Lex代码应该使用Yacc (yacc -d)生成的头文件。
随着联合之间的脱节问题得到解决,并且确认将<< endl添加到Lex代码中显示了该输出,您是否也考虑将<< endl添加到Yacc代码中?如果不是,就这么做吧!如果您这样做了,请编辑问题中的代码以准确反映您所获得的内容;我们无法从Internet的这一端读取您的屏幕。
发布于 2011-01-05 14:01:38
“‘yytext”是包含当前标记的静态缓冲区。然后将一个指针传入该缓冲区(作为yylval)给解析器。这有一个相当严重的问题,如果你的输入中有更多的标记,这些后面的标记可能会覆盖之前标记指向的相同的yytext缓冲区,所以如果你让解析器变得更复杂,你可能会看到随机的垃圾。这里的简单示例没有显示这个问题,因为它在看到“Id”令牌后不会尝试读取另一个令牌。
https://stackoverflow.com/questions/4600117
复制相似问题