我想创建一个语法和词法分析器来解析以下字符串:
100 reason phrase
正则表达式将是:“\d{3} [^\r\n]*”
令牌定义:
template <typename Lexer>
struct custom_tokens : lex::lexer<Lexer>
{
custom_tokens()
{
this->self.add_pattern
("STATUSCODE", "\\d{3}")
("SP", " ")
("REASONPHRASE", "[^\r\n]*")
;
this->self.add
("{STATUSCODE}", T_STATUSCODE)
("{SP}", T_SP)
("{REASONPHRASE}", T_REASONPHRASE)
;
}
};
语法:
template <typename Iterator>
struct custom_grammar : qi::grammar<Iterator >
{
template <typename TokenDef>
custom_grammar(TokenDef const& tok)
: custom_grammar::base_type(start)
{
start = (qi::token(T_STATUSCODE) >> qi::token(T_SP) >> qi::token(T_REASONPHRASE));
}
qi::rule<Iterator> start;
};
但是,我意识到我无法定义令牌“T_REASONPHRASE”,因为它将匹配包括“T_STATUSCODE”在内的所有内容。我能做的是
取消定义 T_REASONPHRASE 并使用 qi::lexeme 在 custom_grammar 中编写规则?
我可以使用 lex state 来做到这一点吗?例如,在第二个状态下定义“T_REASONPHRASE”,如果它在第一个状态下看到 T_STATUSCODE,然后将其余部分解析为第二个状态?请举个例子?