我已经写了一个挠曲和野牛,我正面临一个问题,这是通过下面的程序说明。
该程序旨在解析由等于(=)号分隔的键值对,我希望我的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;
}下面是野牛的节目
%{
/* 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"可以看到,正在打印的令牌是不正确的,从令牌开始的整个字符串正在打印。请告诉我这个计划出了什么问题。
发布于 2015-12-27 14:51:13
问题是,您正在保存指向yytext的指针,稍后将在flex扫描仪中更新该指针。如果将其更改为在yytext中保存字符串的副本,则会得到更一致的结果,例如,
yylval = strdup(yytext);而不是
yylval = yytext;进一步读:
https://stackoverflow.com/questions/34481209
复制相似问题