C++ Bison解析器:生成一个返回令牌的函数
在我的flex中,我希望能够做到以下几点:C++ Bison解析器:生成一个返回令牌的函数,c++,c,bison,flex-lexer,C++,C,Bison,Flex Lexer,在我的flex中,我希望能够做到以下几点: {VARIABLE} { yylval.string_val=strdup(yytext); return getVarType(yytext); //that is the issue } X getVarType(const char* v){ if(case 1...)
{VARIABLE} {
yylval.string_val=strdup(yytext);
return getVarType(yytext); //that is the issue
}
X getVarType(const char* v){
if(case 1...)
return VAR_INT;
if(case 2...)
return VAR_DOUBLE;
etc....
}
我的问题是,getVarType函数的返回类型应该是什么?我希望它看起来像这样:
{VARIABLE} {
yylval.string_val=strdup(yytext);
return getVarType(yytext); //that is the issue
}
X getVarType(const char* v){
if(case 1...)
return VAR_INT;
if(case 2...)
return VAR_DOUBLE;
etc....
}
X应该是什么
void *p;
char *s;
void main()
{
void *p=myFun();
if(strcmp(s,"int")==0)
{
Print("function return int and val: =%d",(*int)*p);
}
//similarly compare for all data types and just type cast to that data types
}
void *myFun()
{
if(case1)
{
p=address of that data type variable suppose int;
s="data type";
}
if(case2)
{
p=&of that data type variable suppose char etc;
s="data type";
}
return p;
}
我认为这是唯一的方法,但有一个问题,如果函数返回,它会破坏所有局部变量,因此返回局部变量的地址不是错误的,但函数返回的值是否有效,我们不能说。
void指针称为generic pointer我们可以为该指针提供任何数据类型地址,但在检索值类型转换时是必需的。
希望这对你有多大的帮助
谢谢和问候
asif aftab
我认为这是唯一的方法,但有一个问题,如果函数返回,它会破坏所有局部变量,因此返回局部变量的地址不是错误的,但函数返回的值是否有效,我们不能说。
void指针称为generic pointer我们可以为该指针提供任何数据类型地址,但在检索值类型转换时是必需的。
希望这对你有多大的帮助
谢谢和问候
asif aftab
我认为这是唯一的方法,但有一个问题,如果函数返回,它会破坏所有局部变量,因此返回局部变量的地址不是错误的,但函数返回的值是否有效,我们不能说。
void指针称为generic pointer我们可以为该指针提供任何数据类型地址,但在检索值类型转换时是必需的。
希望这对你有多大的帮助
谢谢和问候
asif aftab
我认为这是唯一的方法,但有一个问题,如果函数返回,它会破坏所有局部变量,因此返回局部变量的地址不是错误的,但函数返回的值是否有效,我们不能说。
void指针称为generic pointer我们可以为该指针提供任何数据类型地址,但在检索值类型转换时是必需的。
希望这对你有多大的帮助
谢谢和问候
asif aftab返回一个
int
。此外,返回bison/yacc解析器能够正确理解的令牌类型的唯一有意义的方法是声明各种VAR\u INT
、VAR\u DOUBLE
,等等。。。作为bison/yacc文件中的%token
s(并导入生成的头文件,但我认为您已经在这样做了)。生成的头文件将这些变量声明为int
因此,您的getVarType
函数可以返回任何类型的T
,只要您可以将int
转换为T
,然后将其转换回int
,而不会丢失信息,但最简单的方法是返回int
在lexer中进行类型分析(并因此管理符号表)会在lexer和解析器之间产生依赖关系,通常应该避免这种依赖关系,除非您从中获得一些值。在这种特殊情况下,很难看出产生了什么价值,但这取决于你自己。在完成的AST上进行类型分析通常比在解析过程中进行更容易
在任何情况下,您都有一个符号表,这表明没有必要
strdup
变量名;您可以在符号表中查找它们,然后返回指向符号表条目的指针。这将节省大量跟踪内存分配的工作。(它仍然在lexer和解析器之间创建了一个依赖关系,但它的依赖关系没有那么紧密。从lexer的角度来看,符号表可以是只读的,并且可以作为yylex
的额外引用/指针参数提供)yylex
返回一个int
。此外,返回bison/yacc解析器能够正确理解的令牌类型的唯一有意义的方法是声明各种VAR\u INT
、VAR\u DOUBLE
,等等。。。作为bison/yacc文件中的%token
s(并导入生成的头文件,但我认为您已经在这样做了)。生成的头文件将这些变量声明为int
因此,您的getVarType
函数可以返回任何类型的T
,只要您可以将int
转换为T
,然后将其转换回int
,而不会丢失信息,但最简单的方法是返回int
在lexer中进行类型分析(并因此管理符号表)会在lexer和解析器之间产生依赖关系,通常应该避免这种依赖关系,除非您从中获得一些值。在这种特殊情况下,很难看出产生了什么价值,但这取决于你自己。在完成的AST上进行类型分析通常比在解析过程中进行更容易
在任何情况下,您都有一个符号表,这表明没有必要
strdup
变量名;您可以在符号表中查找它们,然后返回指向符号表条目的指针。这将节省大量跟踪内存分配的工作。(它仍然在lexer和解析器之间创建了一个依赖关系,但它的依赖关系没有那么紧密。从lexer的角度来看,符号表可以是只读的,并且可以作为yylex
的额外引用/指针参数提供)yylex
返回一个int
。此外,返回bison/yacc解析器能够正确理解的令牌类型的唯一有意义的方法是声明各种VAR\u INT
、VAR\u DOUBLE
,等等。。。作为bison/yacc文件中的%token
s(并导入生成的头文件,但我认为您已经在这样做了)。他产生了