Bison 野牛标记是字符串的其余部分

Bison 野牛标记是字符串的其余部分,bison,flex-lexer,yacc,Bison,Flex Lexer,Yacc,我写了一本flex和bison, 我面临一个问题,下面的程序说明了这个问题 该程序旨在解析由等号(=)分隔的键值对 我希望我的bison脚本标记键和值并打印它们 下面是我的flex程序的片段 %{ /* file : kvp.l */ #include <stdio.h> #define YYSTYPE char* #include "kvp.tab.h" %} %% [a-zA-Z0-9][_a-zA-Z0-9]* {

我写了一本flex和bison, 我面临一个问题,下面的程序说明了这个问题

该程序旨在解析由等号(=)分隔的键值对 我希望我的bison脚本标记键和值并打印它们

下面是我的flex程序的片段

%{
    /* file : kvp.l */
    #include <stdio.h>
    #define YYSTYPE char*
    #include "kvp.tab.h"
%}

%%
[a-zA-Z0-9][_a-zA-Z0-9]*    {
                                yylval=yytext;
                                return IDENTIFIER;
                            }
"="                         {
                                yylval=yytext;
                                return EQUALS_OP;
                            }
.                           ; /* Do Nothing */
%%

int yywrap()
{
    return 1;
}
可以看出,正在打印的令牌不正确,从令牌开始的整个字符串正在打印。
请告诉我这个程序哪里出了问题。

问题是您正在保存一个指向
yytext
的指针,该指针稍后会在flex扫描仪中更新。如果更改此选项以在
yytext
中保存字符串副本,则会得到更一致的结果,例如

yylval = strdup(yytext);
而不是

yylval = yytext;
进一步阅读:

yylval = strdup(yytext);
yylval = yytext;