我有一个基于它的词法分析器,spirit::lexertl
它产生用lex::token_def<std::string>
. 我想使用一个qi::symbols<>
表来匹配该表中的标记,使用符号表中的关联数据作为规则中的属性。像这样的东西[从实际代码中浓缩]:
qi::symbols<char, int> mode_table;
mode_table.add("normal", 0)("lighten", 1)("darken", 2);
rule<Iterator, int()> mode = raw_token(tok.kMode) >> ':' >> ascii::no_case[mode_table];
但是,当我编译它时,我收到以下错误:
/Users/tim/Documents/src/tr_libs/boost/boost_1_49_0/boost/spirit/home/qi/string/detail/tst.hpp:80:错误:从“char”转换为非标量类型'boost::spirit::lex::lexertl::token<boost::spirit::line_pos_iterator<boost::spirit::multi_pass<std::istreambuf_iterator<char, std::char_traits<char>>, boost:: Spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::buf_id_check, boost::spirit::iterator_policies::buffering_input_iterator, boost::spirit::iterator_policies:: split_std_deque> > >, boost::mpl::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::spirit::basic_string<std::basic_string<字符、std::char_traits<char>、std::allocator<char> >、symbol_type>、double、mpl_::na、mpl_::na、mpl_::na、mpl_::na、mpl_::na、mpl_ ::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,mpl_::na, mpl_::na>, mpl_::bool_<true>, long unsigned int>'请求
tst.hpp 中的第 80 行是这样的:
c = filter(*i);
在我看来,它确实正在尝试将我的词法分析器标记转换为 a char
,我理解它是symbols<char, int>
表中的字符类型。一时兴起,我确实尝试了symbols<ident, int>
——ident
我的令牌类型在哪里——但这显然不是记录在案的symbols<>
API,而且可以预见的是它不起作用。
(你可能会问为什么我不让词法分析器将这些标识符作为令牌 ID 发出,就像kMode
上面的示例一样。在这种特殊情况下我可能会这样做,但我真的很好奇集成符号的一般情况带有词法分析器的语法中的表。)
从根本上说,我认为我的问题是:是否可以以qi::symbols<>
这种方式使用来匹配来自 Spirit 词法分析器的标记?