提振精神:如何匹配气中的任何词法分析器标记?
boost spirit: how to match any lexer token in qi?
我想将 C++ 函数声明与默认参数值匹配,但忽略这些值。
例如:
int myFunction(int a, int b = 5 + 4);
这是词法分析器的(一部分):
struct Lexer : boost::spirit::lex::lexer<lexer_type>
{
Lexer()
{
identifier = "[A-Za-z_][A-Za-z0-9_]*";
numLiteral = "([0-9]+)|(0x[0-9a-fA-F]+)";
this->self.add
("int")
('+')
('=')
('(')
(')')
(';')
(',')
(identifier)
(numLiteral);
}
};
我想编写一些解析器规则,例如:
function = qi::lit("int") >> lexer.identifier >> '(' >> arglist >> ')' >> ';';
arglist = (lexer.numLiteral >> lexer.identifier >> -(lit('=') >> rvalue )) % ',';
rvalue = +(qi::token() - ',' - ')');
我看过 here "The parser primitives qi::token and qi::tokenid can now be used without any argument. In this case they will match any token."。这就是我想要的(以及我写的),但不幸的是它无法编译。
qi::token() 确实至少需要一个参数。
我错过了什么吗?
好的,因为这显然足以回答它:
Which is what I want (and what I wrote), but unfortunately it does not compile. qi::token() really needs at leat one argument. Did I miss something?
可能你错过的还不够多:你离开()
了吗?因为在 EDSL 中,惯例是去掉无参数版本的括号(cf. qi::string
vs. qi::string("value")
)
我想将 C++ 函数声明与默认参数值匹配,但忽略这些值。 例如:
int myFunction(int a, int b = 5 + 4);
这是词法分析器的(一部分):
struct Lexer : boost::spirit::lex::lexer<lexer_type>
{
Lexer()
{
identifier = "[A-Za-z_][A-Za-z0-9_]*";
numLiteral = "([0-9]+)|(0x[0-9a-fA-F]+)";
this->self.add
("int")
('+')
('=')
('(')
(')')
(';')
(',')
(identifier)
(numLiteral);
}
};
我想编写一些解析器规则,例如:
function = qi::lit("int") >> lexer.identifier >> '(' >> arglist >> ')' >> ';';
arglist = (lexer.numLiteral >> lexer.identifier >> -(lit('=') >> rvalue )) % ',';
rvalue = +(qi::token() - ',' - ')');
我看过 here "The parser primitives qi::token and qi::tokenid can now be used without any argument. In this case they will match any token."。这就是我想要的(以及我写的),但不幸的是它无法编译。 qi::token() 确实至少需要一个参数。 我错过了什么吗?
好的,因为这显然足以回答它:
Which is what I want (and what I wrote), but unfortunately it does not compile. qi::token() really needs at leat one argument. Did I miss something?
可能你错过的还不够多:你离开()
了吗?因为在 EDSL 中,惯例是去掉无参数版本的括号(cf. qi::string
vs. qi::string("value")
)