我有一个简单的结构
// 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);
}
};
我有两种不同的方式来解析结构,我在另一个线程中询问并开始工作(大部分)。
我的语法如下所示:
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";
}
如果我输入 likefoo exists
并且 exp.key 等于“foo”并且 exp.op 等于相应的枚举值(在本例中为 0),这一切都可以正常工作。类似的东西foo1 nexists
也有效。
但是,第二条规则并不像我预期的那样起作用。如果我给它输入,nexists(foo)
那么我得到以下输出:
-------------------------
Parsing succeeded
key: nexistsfoo
op : 1
-------------------------
似乎枚举值设置得当,但我无法弄清楚为什么“nexsts”会被添加到密钥字符串之前。有人可以告诉我如何修复我的规则,以便密钥与第二条规则相等吗?
我在这里发布了一份精简代码的副本,说明了我的问题:http: //pastebin.com/402M9iTS