以下の文字列を解析する文法とレクサーを作成したいと思います。
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 を使用してそれを行うことはできますか? たとえば、2 番目の状態で "T_REASONPHRASE" を定義し、最初の状態で T_STATUSCODE を確認した場合、残りを 2 番目の状態に解析しますか? 例を教えてください。