使用Bison中的yylval来恢复一个字符串。

7

你好,我对如何在读取特定标记时获取char*感到困惑...

我查看了各种网站,它们提供了建议,但并不完整,我的意思是,例如缺少yylval和yytext声明或如何转换类型等

.l文件需要什么?

.y文件需要什么?

我有什么:

在.l文件中:

{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

在bison的手册中提到yylval是一个宏,我知道宏是一种被其他文本替换的文本,但在这种情况下我真的不明白。
1个回答

17

yylval是一个union类型的YYSTYPE。在扫描器中更改分配为yylval.str = strdup(yytext)

yylval是一个union,你可以声明它,也可以让bison自动声明。Bison的默认yylval基本上没有用处。你可以在解析器中使用%union { ... }声明yylval,因为你可能需要从扫描器向解析器返回其他值。例如,在扫描器中匹配数字时,你希望返回像T_NUM这样的标记。但你很可能还想要该数字的值,这就是yylval派上用场的地方。使用yylval,如果你有一个整数字段,你可以在扫描器中简单地执行yylval.num = atoi(yytext),然后在解析器中使用该num字段。

yytext是一个字符数组,作为当前正在解析的输入的缓冲区。你不能声明yytext,也不应该这样做。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接