Bison 令牌是字符串的其余部分
Bison token is rest of the string
我写过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;
}
下面是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", );
printf("YACC : Equals = \"%s\"\n", );
printf("YACC : Value = \"%s\"\n", );
};
%%
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"
可以看到正在打印的标记不正确,正在打印从标记开始的整个字符串。
请告诉我这个程序哪里出错了。
问题是您正在保存指向 yytext
的指针,该指针稍后会在 flex 扫描仪中更新。如果您更改它以保存 yytext
中字符串的 copy,您将获得更一致的结果,例如,
yylval = strdup(yytext);
而不是
yylval = yytext;
进一步阅读:
我写过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;
}
下面是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", );
printf("YACC : Equals = \"%s\"\n", );
printf("YACC : Value = \"%s\"\n", );
};
%%
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"
可以看到正在打印的标记不正确,正在打印从标记开始的整个字符串。 请告诉我这个程序哪里出错了。
问题是您正在保存指向 yytext
的指针,该指针稍后会在 flex 扫描仪中更新。如果您更改它以保存 yytext
中字符串的 copy,您将获得更一致的结果,例如,
yylval = strdup(yytext);
而不是
yylval = yytext;
进一步阅读: