Сокращение зубров не сработало, как ожидалось

Я пытаюсь написать анализатор EPL, поэтому я изучаю flex и bison. Я пытаюсь использовать его по следующим правилам (SQL):

SELECT { cout<<"SELECT detected"<<endl;return SELECT; }
FROM { cout<<"FROM detected"<<endl;return FROM;}
[a-zA-Z][0-9a-zA-Z]* { cout<<"IDENTIFIER detected"<<endl;yylval.c=yytext;
                         return IDENTIFIER; }
'$' { return DOL;}
[ \t] { cout<<"space founded:"<<int(yytext[0])<<endl; }
\n { return EOL;}
. {}

и правила бизонов:

sel_stmt : {cout<<"VOID"<<endl;}
         | SELECT identifier_expr FROM identifier_expr {    cout<<"select statement founded"<<endl; }
         ;

identifier_expr : DOL IDENTIFIER {
$$=$2;
cout<<"ident_expr:"<<$$<<endl;
}
;

все токены и нетерминалы имеют тип "char*"

так как входные данные из stdin - это "select $abc from $ddd", когда лексер возвратил токен FROM, в действии "identifier_expr" выводится "identif_expr:abc from", почему это произошло?

1 ответ

Вы должны создать копию строки токена (yytext) если вы хотите использовать его вне действия flex. Строка, на которую указывает yytext является временным значением и будет изменено, как только лексер будет введен повторно.

См. Часто задаваемые вопросы о зубрах, руководство по гибкому программированию или любое количество вопросов SO (которые труднее найти, потому что многие спрашивающие неправильно диагностируют проблему).

Другие вопросы по тегам