2015-12-27 5 views
2

Я написал flex и bison, Я столкнулся с проблемой, которая проиллюстрирована с помощью следующей программы.Bison token - остальная часть строки

Программа предназначена для синтаксического анализа пар ключ-значение, разделенных знаком равенства (=) Я надеюсь, что мой бизонный скрипт токенизирует ключ и значения и печатает их.

Ниже приведен фрагмент кода моей гибкой программы

%{ 
    /* 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; 
} 

Результат, который я получаю из этой программы, как показано ниже.

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

Как можно видеть маркеры, которые печатаются не так, вся строка, начиная с маркеров печатаются. Скажите, пожалуйста, где я ошибаюсь в этой программе.

ответ

1

Проблема в том, что вы сохраняете указатель на yytext, который впоследствии обновляется в гибком сканере. Если вы изменяете, что сохранить копию строки в yytext, вы получите более достоверные результаты, например,

yylval = strdup(yytext); 

, а не

yylval = yytext; 

Далее чтение:

Смежные вопросы