我正在尝试使用boost::spirit:qi
从其他参数动态构建解析器。目标是解析一个字符串并用键和值填充std::map<std::string, std::string>
。但是,映射的关键字段没有被解析(即在解析器生成之前它是已知的)。如何编写用已知密钥填充地图的语义操作?
我猜我需要编写一个语义操作,将映射的键设置为适当的分析值。我可以看到qi::_1
提供了解析器的内容,但我如何引用返回结构(在本例中为std::map
)?
如果std::map
是在范围内,我可以直接给它分配是这样的:
parser = lit(prefix) >> value_parser[map_[key] = _1];
但在我的情况,我想实际产生的解析器,不做解析。我猜我需要更换map_[key]
。
提供一点更多的内容(的要求):
我首先分析了“模板”的字符串,看起来是这样的:
/path/to/:somewhere:/nifty.json
的:somewhere:
是代表任何字符串,稍后可以通过名称somewhere
引用。我有解析器运行良好。
接下来,我想从该模板生成另一解析器解析字符串是这样的:
/path/to/anywhere/nifty.json
并提供我一个std::map<std::string, std::string> m
其中m["somewhere"] == "anywhere"
。
你能分享一些更详细的信息吗?我想帮忙,但我无法弄清楚密钥是如何预先知道的。有某个地方有钥匙清单吗?还是只有一个?另外,为什么地图不在范围内?它可以是语法的(引用)数据成员,在语法本身时被初始化。 – 2013-02-12 22:33:14
当然:我实际上需要两个文法。第一个解析一个“模板”的种类,为我提供一个键向量。然后我需要使用这一系列的键并动态创建一个接受某种格式的解析器,并使用已经提供的键存储这些字段。它*可能是我可以生成解析器并在一步完成解析,但程序将使用生成的解析器无数次,我想缓存它。 – 2013-02-13 14:08:40
我添加了一些上下文。 – 2013-02-13 14:40:14