2013-10-08 63 views
0

編輯:我已經撕掉了詞法分析器,因爲它不會與Qi完全整合,只是混淆了語法(請參閱here)。boost-spirit-lex構建給令牌一個字符串名稱的方式?


我需要給令牌類型,我可以在qion_error處理程序使用一個名稱。目前,_4qi::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; 
}; 
+0

Ok lex-> qi互動是可怕的,並沒有得到很好的想法。我正在撕掉它。 –

回答

0

編輯:我已經撕去了詞法分析器,因爲它不乾淨齊整合,只是混淆語法(見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是詞法分析器對象,通過該標記定義可被訪問。