0

我一直在将 boost::spirit 实施到一个项目中,我面临的挑战之一是直接解析为以下类型的容器:

map<string, string> 

我快到了。我遇到的问题是自动分配 std::pair 的键值。也就是说,我的输入字符串中的每个标记都有一个预先确定的键,我希望在解析标记时将它自动插入到该对中。

我想我很接近,但也许不是......这是(截断的)语法:

        command =
            string( "select" )
            ;

        key = string( "command" ) | qi::attr( std::string("command") );

        command_pair = key >> ' ' >> command;

        start =
            command_pair >> *command_pair
            ;
    qi::rule<Iterator, std::string()> command;
    qi::rule<Iterator, std::pair<std::string, std::string>()> command_pair;
    qi::rule<Iterator,parserMap()> start;

最终结果是在命令行中输入:

select

并让解析器插入“命令”作为键,就好像我输入了:

command select

因此,访问 map["command"] 元素将返回一个值 "select"。

问题是,我无法让 qi::attr() 完成这项工作。也就是说,如果我输入“命令选择”,它就可以工作,而不仅仅是“选择”。

4

1 回答 1

0

看来我让它变得比需要的更困难。

解决方案在于我没有引用的部分代码。我使用 parse 而不是 phrase_parse() 来调用我的语法。启用自动跳格。

于 2012-01-28T15:02:26.900 回答