我有一个简单的结构
// in namespace client
struct UnaryExpression
{
std::string key;
SomeEnums::CompareType op;
};
SomeEnums::CompareType
是一个枚举,我在其中定义符号表:
struct UnaryOps : bsq::symbols<char, SomeEnums::CompareType>
{
UnaryOps() : bsq::symbols<char, SomeEnums::CompareType>(std::string("UnaryOps"))
{
add("exists", SomeEnums::Exists)
("nexists", SomeEnums::NotExists);
}
};
我有两种不同的方式来解析结构,我在another thread中询问并且(大多数情况下)开始工作。
我的语法如下:
template<typename Iterator>
struct test_parser : bsq::grammar<Iterator, client::UnaryExpression(), bsq::ascii::space_type>
{
test_parser()
: test_parser::base_type(unaryExp, std::string("Test"))
{
using bsq::no_case;
key %= bsq::lexeme[bsq::alnum >> +(bsq::alnum | bsq::char_('.'))];
unaryExp %= unaryE | unaryF;
unaryE %= key >> no_case[unaryOps];
unaryF %= no_case[unaryOps] >> '(' >> key >> ')';
};
UnaryOps unaryOps;
bsq::rule<Iterator, std::string(), bsq::ascii::space_type> key;
bsq::rule<Iterator, client::UnaryExpression(), bsq::ascii::space_type> unaryExp;
bsq::rule<Iterator, client::UnaryExpression(), bsq::ascii::space_type> unaryE;
bsq::rule<Iterator, client::UnaryFunction(), bsq::ascii::space_type> unaryF;
};
我正在使用以下逻辑解析代码:
bool r = phrase_parse(iter, end, parser, bsq::ascii::space, exp);
if (r && iter == end)
{
std::cout << "-------------------------\n";
std::cout << "Parsing succeeded\n";
std::cout << "key: " << exp.key << "\n";
std::cout << "op : " << exp.op << "\n";
std::cout << "-------------------------\n";
}
如果我输入foo exists
和exp.key等于“foo”并且exp.op等于相应的枚举值(在这种情况下为0),这一切都正常。像foo1 nexists
这样的东西也可以。
但是,第二条规则并不像我预期的那样有效。如果我输入nexists(foo)
,那么我得到以下输出:
-------------------------
Parsing succeeded
key: nexistsfoo
op : 1
-------------------------
似乎enum值已经设置得恰当但我无法弄清楚为什么“nexsts”会被添加到键字符串之前。有人可以告诉我如何修复我的规则,以便密钥与第二条规则只相同'foo'吗?
我发布了一份精简代码的副本,用于说明我的问题:http://pastebin.com/402M9iTS