如何解析函数及其参数

时间:2011-07-19 23:21:22

标签: c++ parsing boost

对于我的词法分析器,我正在使用boost::wave词法迭代器,它为.cpp.h .hpp等文件提供了所有令牌。

现在我想找到一组标记,即标识符后跟open parenthesis,然后是由comma和最后closed parenthesis分隔的参数集,是C ++程序中的函数。我的意思是我应该如何分析一组令牌以确保我有一个功能?

我正在尝试使用递归下降解析器来实现它。直到现在我的递归下降解析器可以解析算术表达式并处理几乎所有类型的运算符优先级。

或者是否有一个函数(在boost::wave中)可以直接为我解析一个函数?

如果有人可以建议我如何在函数参数中找到type变量,那将会有所帮助。例如如果我有一个功能:

int myfun(char* c, T& t1) { //... }

然后我如何获得char*的令牌,这些令牌可被视为c的类型。 类似T&的令牌可被视为t1的类型?

编辑:这是对我的问题的更多解释

的引用:

增强波文档

http://www.boost.org/doc/libs/1_47_0/libs/wave/index.html

令牌标识符列表

http://www.boost.org/doc/libs/1_47_0/libs/wave/doc/token_ids.html

typedef boost::wave::cpplexer::lex_token<> token_type;
typedef boost::wave::cpplexer::lex_iterator<token_type> token_iterator;
typedef token_type::position_type position_type;

position_type pos(filename);

//instr is the input file stream
token_iterator  it = token_iterator(instr.begin(), instr.end(), pos,
      boost::wave::language_support(
        boost::wave::support_cpp|boost::wave::support_option_long_long));
token_iterator  end = token_iterator();

//while it != end 
//...
boost::wave::token_id id = boost::wave::token_id(*it);

switch(id){
//...

    case boost::wave::T_IDENTIFIER:
      Match(id);//consumes one token and increments the token_iterator
        //get the token id of the next token       
      id = boost::wave::token_id(*it);
 //if an identifier is immediately followed by T_LEFTPAREN then it will be a function
      if(id == boost::wave::T_LEFTPAREN) {
        Match(id);                         (1)
        //this function i want to implement
        ParseFunction();                   (2) 
        Match(boost::wave::T_RIGHTPAREN);
      }
//...
}

所以问题是如何实现ParseFunction()函数

1 个答案:

答案 0 :(得分:-1)

如果您的系统符合POSIX标准(Linux,MacOSX,Solaris,...),您可以使用dlopen / dlsym来确定该符号是否存在。您需要注意名称修改,在某些系统上,您需要注意[例如] sin的真实姓名是_sin

dlsym是否返回指向函数的指针或指向某个全局变量的指针 - dlsym是无能为力的。事实上,你必须做一些与使用dlsym的C和C ++标准非常相反的事情:你必须将void*返回的dlsym指针强制转换为功能指针。 POSIX标准与C / C ++冲突。也就是说,如果您使用的是POSIX兼容系统,那些void*指针将转换为函数指针(否则系统不符合POSIX)。


修改

一个巨大的问题:你怎么称呼你刚发现的东西?如果有的话,如何知道如何处理返回值?

一个简单示例:假设您的输入文件包含xsq = pow (x, 2)。您必须提前知道pow的签名是double pow (double, double)

与使用dlsym相比,您最好不要处理一些有限的函数,而这些函数是您明确构建到解析器中的。