我现在正在处理一个奇怪的案例,我需要在两个不同的上下文中使用相同的符号表。在“J”命令的情况下,我只想查看符号表中以特定前缀开头的元素,但是这个前缀不会在解析的文本中指定,而仅用于在符号表。
我当前的解决方案是在解析器之外循环遍历符号表,生成专门用于此“J”命令的第二个符号表,但我很好奇是否有办法将其组合到解析器中。
目前,以下玩具代码导致 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;
}