0
編輯:我已經撕掉了詞法分析器,因爲它不會與Qi完全整合,只是混淆了語法(請參閱here)。boost-spirit-lex構建給令牌一個字符串名稱的方式?
我需要給令牌類型,我可以在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互動是可怕的,並沒有得到很好的想法。我正在撕掉它。 –