【问题标题】:boost-spirit-lex built in way for giving tokens a string name?boost-spirit-lex 内置用于为令牌提供字符串名称的方式?
【发布时间】:2013-10-08 09:41:45
【问题描述】:

编辑:我已经删除了词法分析器,因为它没有与 Qi 完全集成,只是混淆了语法(参见 here)。


我需要给令牌类型一个我可以在qi 中的on_error 处理程序中使用的名称。目前,_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;
};

【问题讨论】:

  • Ok lex->qi 交互非常可怕,而且还没有经过深思熟虑。我把它撕掉了。

标签: c++ parsing lex boost-spirit lexical-analysis


【解决方案1】:

编辑:我已经删除了词法分析器,因为它没有与 Qi 完全集成,只是混淆了语法(参见 here)。


这是一个检测on_error 机制捕获的令牌的小技巧。接线不会很愉快:D

template<typename State>
struct error_handler_impl
{
    typedef void result_type;

    State & state;
    error_handler_impl(State & state) : state(state) {}

    template <typename What, typename Iterator>
    void operator()(const std::string & msg,What what, Iterator it) const
    {
        if(boost::get<boost::spirit::utf8_string>(what.value) == state.tok.identifier.definition())
        {
            std::cout << "token type is identifier" << std::endl;
        }
    }
};

state.tok 是词法分析器对象,通过它可以访问标记定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多