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

时间:2010-11-26 18:56:19

标签: string bison

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

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

我有什么

<。>文件中的

{WORD}      { yylval = strdup(yytext);return T_ValidWord;}
<。>在.y文件中:

%union{
  char *str;
}

%token<str> T_ValidWord

%%

element:
T_OpenTag T_ValidWord ele1 {printf("%s", $2);}
; 

错误:

xml.lex: In function ‘yylex’:
xml.lex:34: error: incompatible types when assigning to type ‘YYSTYPE’ from type ‘char *’

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

yylval->something = yytext
yylval.something = yytext
yylval = yytext

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

1 个答案:

答案 0 :(得分:12)

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。