提升精神 - 解析器捕获不需要的文本

时间:2013-01-25 21:11:26

标签: boost boost-spirit

我有一个简单的结构

// 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

0 个答案:

没有答案
相关问题