在野牛中使用yylval来恢复字符串

mjs*_*jsr 5 string bison

嗨我很困惑如何获取char*当我读取特定令牌时...我查看各种网站,他们提供建议但不完整,我的意思是,例如yylval和yytext声明丢失或如何转换类型,等等

.l文件中需要什么?.y文件中需要什么?

是)我有的

在.l文件中:

{WORD}      { yylval = strdup(yytext);return T_ValidWord;}
Run Code Online (Sandbox Code Playgroud)

在.y文件中:

%union{
  char *str;
}

%token<str> T_ValidWord

%%

element:
T_OpenTag T_ValidWord ele1 {printf("%s", $2);}
; 
Run Code Online (Sandbox Code Playgroud)

错误:

xml.lex: In function ‘yylex’:
xml.lex:34: error: incompatible types when assigning to type ‘YYSTYPE’ from type ‘char *’
Run Code Online (Sandbox Code Playgroud)

更让我困惑的其他事情:在某些地方我看到了

yylval->something = yytext
yylval.something = yytext
yylval = yytext
Run Code Online (Sandbox Code Playgroud)

在野牛的手册中告诉yylval是一个宏,我明白宏是用其他文本替换的文本,但在这种情况下我真的不明白.

Kiz*_*aru 14

yylval是一个联合类型YYSTYPE.将扫描仪中的作业更改为yylval.str = strdup(yytext).

yylval是一个联盟,您可以声明或野牛将自动声明.Bison的默认yylval基本没用.您%union { ... }在解析器中声明yylval使用,因为您可能需要将其他值从扫描程序返回到解析器.例如,当您匹配扫描仪中的数字时,您将需要返回一个令牌T_NUM.但是你很可能也想要这个数字的值,这是yylval派上用场的地方.使用yylval,如果你有一个整数字段,你可以简单地yylval.num = atoi(yytext)在扫描仪内部,然后在解析器中使用该num字段.

yytext是一个字符数组,用作当前正在解析的输入的缓冲区.你不能申报yytext,你也不应该.

当您使用bison将解析器编译为.tab.c文件时,请使用标志bison -d -t来调试符号和头文件.头文件将被称为*.tab.h.将其包含在扫描仪中,这样您只需要声明一次令牌名称并正确使用yylval.