野牛令牌是其余的字符串

时间:2015-12-27 14:08:03

标签: bison flex-lexer yacc

我写了一个flex and 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;
}

以下是Bison计划

%{
    /* file : kvp.y */
    #include <stdio.h>
    #include <stdlib.h>

    /* interface to the lexer */
    int yylex();
    int yyerror (char const *s);
%}

%token IDENTIFIER EQUALS_OP
%start stmt

%%
stmt: stmt pair | pair;
pair: IDENTIFIER EQUALS_OP IDENTIFIER
                                        {
                                            printf("YACC : Key     = \"%s\"\n", $1);
                                            printf("YACC : Equals  = \"%s\"\n", $2);
                                            printf("YACC : Value   = \"%s\"\n", $3);
                                        };
%%

int yyerror (char const *s)
{
    fprintf (stderr, "Error String = \"%s\"\n", s);
}

int main( int argc, char* argv[])
{
    yyparse();
    return 0;
}

我从这个程序中得到的结果如下。

student@debian:~/stack-overflow$ flex kvp.l
student@debian:~/stack-overflow$ bison -d --file-prefix=y kvp.y
student@debian:~/stack-overflow$ gcc lex.yy.c  y.tab.c -o parser
student@debian:~/stack-overflow$ ./parser 
earth=planet
YACC : Key     = "earth=planet"
YACC : Equals  = "=planet"
YACC : Value   = "planet"

正如可以看到正在打印的标记不正确,正在打印从标记开始的整个字符串。 请告诉我这个程序在哪里出错了。

1 个答案:

答案 0 :(得分:1)

问题是您正在保存指向yytext的指针,该指针稍后会在flex扫描程序中更新。如果您更改为在yytext中保存字符串的副本,您将获得更一致的结果,例如,

yylval = strdup(yytext);

而不是

yylval = yytext;

进一步阅读: