1

現在作業している奇妙なケースがあります。この場合、2つの異なるコンテキストで同じシンボルテーブルを使用する必要があります。「J」コマンドの場合、特定のプレフィックスで始まるシンボルテーブルの要素のみを確認したいのですが、このプレフィックスは解析されたテキストでは指定されず、での検索にのみ使用されます。シンボルテーブル。

私の現在の解決策は、パーサーの外部でシンボルテーブルをループして、この「J」コマンド専用の2番目のシンボルテーブルを生成することですが、これをパーサーに組み合わせる方法があるかどうか興味がありました。

現在、次のおもちゃのコードは100,10,10になりますが、myRuleの最初のsymTable参照に、100,10,1として解析されるように、かなり簡単に変更できますか?

#define BOOST_SPIRIT_USE_PHOENIX_V3
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/qi_symbols.hpp>
#include <boost/foreach.hpp>
#include <string>
#include <vector>
#include <iostream>

namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;

int main() {
    qi::symbols<char, unsigned int> symTable;
    symTable.add("prefix_A", 1)
                ("A"       , 10);
    qi::rule<std::string::const_iterator, unsigned int()> xRule = qi::lit("X")[qi::_val = 100];
    qi::rule<std::string::const_iterator, unsigned int()> myRule =
                      (qi::lit("J") >> qi::omit[+qi::space] >> symTable/*("prefix_")*/)
                    | (qi::lit("R") >> qi::omit[+qi::space] >> symTable)
                    | xRule;

    std::string test = "X;R A;J A";
    std::string::const_iterator it= test.begin();
    std::string::const_iterator end= test.end();
    std::vector<unsigned int> results;

    if (!qi::parse(it, end, (myRule % ";"), results))
        std::cout << "Parse Failed\n";
    else {
        BOOST_FOREACH(unsigned int x, results)
            std::cout << x << ",";
        if(it != end)
            std::cout << "\nIncomplete Parse\n";
        else
            std::cout << "\nParsed\n";
    }
    return 0;
}
4

0 に答える 0