野牛解析器:制作一个返回令牌的函数

时间:2013-11-16 19:44:28

标签: c++ c bison flex-lexer

在我的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应该是什么?

3 个答案:

答案 0 :(得分:2)

yylex会返回int。此外,返回令牌类型的唯一有意义的方法是将bison / yacc解析器正确理解,将各种VAR_INTVAR_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