在bison中,可以通过引用传递非平凡的 YYSTYPE。下面是一个示例代码:
首先,在bison的语法文件中定义 YYSTYPE 的类型。例如,假设我们要传递一个自定义的结构体类型作为 YYSTYPE:
%{
#include
// 定义 YYSTYPE 的类型为自定义的结构体
typedef struct {
int value;
} YYSTYPE;
// 在语法文件中声明 yylval 变量
extern YYSTYPE yylval;
%}
%union {
int intval;
YYSTYPE yystype; // 使用定义的 YYSTYPE 类型
}
%token INTEGER
%%
expression: INTEGER {
// 在规则中使用 yylval 变量来访问 YYSTYPE 的值
printf("The value is: %d\n", yylval.yystype.value);
}
然后,在bison的 C 代码中使用 yylval 变量来传递非平凡的 YYSTYPE。例如,假设我们有一个函数来解析整数值并将其存储在 YYSTYPE 中:
#include
#include "parser.tab.h"
// 使用 YYSTYPE 类型的全局变量来存储解析的值
YYSTYPE yylval;
int yylex() {
int num;
scanf("%d", &num);
// 将解析的整数值存储在 YYSTYPE 中
yylval.yystype.value = num;
return INTEGER;
}
int main() {
yyparse(); // 调用 bison 的解析函数
return 0;
}
在这个示例中,我们使用了自定义的 YYSTYPE 结构体类型,并将解析的整数值存储在其中。然后,在语法规则中,我们可以通过 yylval.yystype.value 访问 YYSTYPE 的值。