在我的flex中,我希望能够做到这样的事情:
{VARIABLE} {
yylval.string_val=strdup(yytext);
return getVarType(yytext); //that is the issue
}
我的问题是,getVarType函数的返回类型应该是什么?我希望它看起来像这样:
X getVarType(const char* v){
if(case 1...)
return VAR_INT;
if(case 2...)
return VAR_DOUBLE;
etc....
}
X应该是什么?
答案 0 :(得分:2)
yylex
会返回int
。此外,返回令牌类型的唯一有意义的方法是将bison / yacc解析器正确理解,将各种VAR_INT
,VAR_DOUBLE
等声明为%token
s in你的bison / yacc文件(并导入生成的头文件,但我认为你已经这样做了)。生成的头文件将这些变量声明为int
。
因此,只要您将getVarType
转换为T
,然后将其转发回int
,您的T
函数就可以返回任何类型int
不丢失信息,但最简单的方法是返回int
。
在词法分析器中进行类型分析(并因此管理符号表)会产生词法分析器和解析器之间的依赖关系,这通常应该避免,除非您从中获得某些值。在这种特殊情况下,很难看出产生了什么价值,但这真的取决于你。对完成的AST进行类型分析通常比在解析期间尝试进行类型分析更容易。
无论如何,你有一个符号表的事实表明没有必要strdup
变量名;您可以在符号表中查找它们,然后返回指向符号表条目的指针。这将节省大量试图跟踪内存分配的工作。 (它仍然在词法分析器和解析器之间创建依赖关系,但它并不像依赖关系那样紧张。从词法分析器的角度来看,符号表可以是只读的,并作为yylex
的额外引用/指针参数提供。 )
答案 1 :(得分:1)
对于它的价值,Bison 3.0会自动为C ++生成这样的函数。例如,如果您的输入文件包含以下内容:
%token <::std::string> TEXT;
%token <int> NUMBER;
%token END_OF_FILE 0;
它将生成您可以通过扫描仪调用的函数:
return parser::make_NUMBER (stage, loc);
return parser::make_TEXT ("Text all!", loc);
return parser::make_END_OF_FILE (loc);
答案 2 :(得分:0)
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指针被称为泛型指针我们可以为此指针提供任何数据类型地址,但在检索值类型时,强制转换是必需的。 希望所以这将有一些帮助你的全部帮助 感谢致敬 asif aftab