对于我的词法分析器,我正在使用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()函数
答案 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
相比,您最好不要处理一些有限的函数,而这些函数是您明确构建到解析器中的。