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 < char、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);
レクサートークンをに変換しようとしているように見えます。これは、テーブルchar
の文字タイプであると理解しています。symbols<char, int>
気まぐれに、私は試しましたsymbols<ident, int>
—トークンタイプはどこにident
ありますか—しかし、それは明らかに文書化されたsymbols<>
APIではなく、予想通り機能しませんでした。
(上記のサンプルのように、レクサーにこれらの識別子をトークンIDとして出力させないのはなぜかと疑問に思われるかもしれません。この特定のケースではそうすることができますが、シンボルを統合する一般的なkMode
ケースについては本当に興味があります。レクサーを使用した文法のテーブル。)
基本的に、私の質問はこれだと思います。qi::symbols<>
このように使用して、Spiritレクサーからのトークンを照合することは可能ですか?