Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Bison解析器:生成一个返回令牌的函数_C++_C_Bison_Flex Lexer - Fatal编程技术网

C++ Bison解析器:生成一个返回令牌的函数

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...)

在我的flex中,我希望能够做到以下几点:

{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(并导入生成的头文件,但我认为您已经在这样做了)。他产生了