0

編集:レクサーはQiときれいに統合されておらず、文法が難読化されているだけなので、レクサーを削除しました(こちらを参照)。


on_errorのハンドラーで使用できる名前をトークン型に付ける必要がありますqi。現時点では、_4( qi::on_error<..>(...,std::cout << _4 << std::endl)) プレースホルダーがトークンの正規表現文字列を提供しています。私のレクサーは次のようになります。

template <typename Lexer>
struct tokens : lex::lexer<Lexer>
{
    tokens()
        : left_curly("\"{\""),
        right_curly("\"}\""),
        left_paren("\"(\""),
        right_paren("\")\""),
        colon(":"),
        scolon(";"),
        namespace_("(?i:namespace)"),
        event("(?i:event)"),
        optional("(?i:optional)"),
        required("(?i:required)"),
        repeated("(?i:repeated)"),
        t_int_4("(?i:int4)"),
        t_int_8("(?i:int8)"),
        t_string("(?i:string)"),
        ordinal("\\d+"),
        identifier("\\w+")

    {
        using boost::spirit::lex::_val;

        this->self
            = 
            left_curly    
            | right_curly 
            | left_paren
            | right_paren
            | colon         
            | scolon
            | namespace_      
            | event             
            | optional           
            | required          
            | repeated
            | t_int_4
            | t_int_8
            | t_string
            | ordinal             
            | identifier         
            | lex::token_def<>("[ \\t\\n]+")   [lex::_pass = lex::pass_flags::pass_ignore];
    }


    lex::token_def<lex::omit> left_curly, right_curly, colon, scolon,repeated, left_paren, right_paren;
    lex::token_def<lex::omit> namespace_, event, optional, required,t_int_4, t_int_8, t_string;
    lex::token_def<boost::uint32_t> ordinal;
    lex::token_def<std::string> identifier;
};
4

1 に答える 1