C Bison打印变量来自flex错误

C Bison打印变量来自flex错误,c,bison,flex-lexer,C,Bison,Flex Lexer,所以我有一条野牛规则,看起来像这样: VAR ID ':' INT '=' intexp ';' {printf("id is '%s'\n", $2);} 我试着用2美元打印“ID”的值 当我插入测试代码进行解析时 var x : int = 5; Bison正在印刷: id is 'x : int = 5;' 而不是我想要的: id is 'x' ID在我的lexer中声明为: {ID} { yylval.id = yytext; return ID; } 如果我在

所以我有一条野牛规则,看起来像这样:

VAR ID ':' INT '=' intexp ';' {printf("id is '%s'\n", $2);}
我试着用2美元打印“ID”的值

当我插入测试代码进行解析时

var x : int = 5;
Bison正在印刷:

id is 'x : int = 5;'
而不是我想要的:

id is 'x'
ID在我的lexer中声明为:

 {ID}        { yylval.id = yytext; return ID; }
如果我在这里的lexer中进行printf,那么yytext的值是正确的('x')


这就是我被困的地方。使用$2打印表达式的其余部分,而不仅仅是特定ID,我不知道为什么。任何见解都将不胜感激。

您必须复制yytext,它是flex中的内部缓冲区

即,代替

{ID}        { yylval.id = yytext; return ID; }
比如:

{ID}    {yylval.id = malloc(yyleng + 1); strcpy(yylval.id, yytext); return ID;}

显然,这不是健壮的,因为它不进行错误检查,您必须处理如何释放解析器中的内存,这些内存不会最终出现在树中,并处理如何将其从树中释放,等等。但这是基本的想法

yylval.id=strdup(yytext)简单得多,并且不太容易发生事故。当然,您仍然需要
释放
返回值。@rici strdup很有用,但它是posix,因此并不总是可用。噢,strdup必须计算strlen,而它作为yyleng免费存在。@rici在标识符中嵌入了空值?明亮的当然,它们通常在一个符号表中,这种方法更适合字符串。