yacc里的YYSTYPE默认是int型的,当然也可以勇%union来定义联合 但是由于程序需要,我要将YYSTYPE定义为我自己定义的一个struct的指针 然后作为一个全局变量,让lex在扫描的时候,可以直接把扫描的东西放到 yylval指向的树节点里去。 但是我在yacchf.h中#define YYSTYPE TreeNodePoint这样是不行的 然而试着在.y文件里的也是不行的。那样在.tab.h文件里,它define的还是 int型的YYSTYPE。在.tab.c文件里则有两个定义。决定很诡异 在.tab.h文件里是 #ifndef YYSTYPE #define YYSTYPE int #endif 在.tab.c文件里 #define YYSTYPE TreeNodePoint ... #ifndef YYSTYPE #define YYSTYPE int #endif 这样,当程序编译运行的时候,YYSTYPE到底是什么型的呢? ===============================================================
// 词法扫描器文件:lex.l
%{
#include
// 将yylval的值类型由默认的int修改为std::string类型,实际上可以修改为你认为的任
// 何类型,仅仅只是需要定一个这样YYSTYPE宏即可,特别注意,这个宏定义必须在后面
// 的标记文件yacc.tab.h之前定义,并且在yacc文件中也要有这个YYSTYPE定义,并且必
// 须和这里的保持一致。实际上YYSTYPE的定义在生成的标记文件yacc.tab.h中有一个宏
// 判断,如果用户也就是我们定义了YYSTYPE宏,那么就用我们定义的YYSTYPE,否则就用
// 默认的YYSTYPE,也就是int类型:)
#define YYSTYPE std::string
#include "yacc.tab.h" -------------------------
// 语法分析器文件:yacc.y
%{
#include
#define YYSTYPE std::string
extern int yylex(); 代码来源:http://blog.csdn.net/pandaxcl/article/details/1536784 ===============================================================
//#define YYSTYPE char // it does not give error ,but it not change the y.tab
//#define YYSTYPE std::string // it does not know the 'std'//#define YYSTYPE string // it unknow 'string'