提升精神:使用更改的局部变量值解析char_

时间:2017-02-17 15:19:58

标签: c++ boost boost-spirit-qi

我想实现一个需要解析实例名称和路径的语法,其中路径是由分隔符分隔的实例名称列表。在列出路径之前,分隔符可以是输入文件中给出的.(句点)或/(斜杠),例如:

DIVIDER .
a.b.c
x.y.z

一旦设置,分隔符永远不会改变整个文件(即如果设置为.,遇到类似a/b/c的路径不应该正确解析)。由于我事先不知道分频器是什么,我考虑将它存储在我的语法变量中并在相应的char_解析器中使用该值(当然,实际的语法是更复杂,但这是我遇到麻烦的部分。)

这有点类似于这个问题:Boost spirit using local variables但不完全是我想要的,因为使用Nabialek技巧可以解析"无效"设置分隔符后的路径。

我不是在这里要求一个完整的解决方案,但我的问题基本上是这样的:我可以将值解析为我的语法成员,然后使用这些值来进一步解析剩余的输入吗?

1 个答案:

答案 0 :(得分:3)

我使用的是继承属性:

char delim = '/';
qi::rule<It, std::string()> element = *~qi::char_(delim);
qi::rule<It, std::vector<std::string>()> path = element % qi::char_(delim);

// use it like:
std::vector<std::string> data;
bool ok = qi::parse(f, l, path, data);

或者你/可以/确实绑定到局部变量:

boost::phoenix::ref

如果您需要它是动态的,请使用char delim = '/'; qi::rule<It, std::string()> element = *~qi::char_(boost::phoenix::ref(delim)); qi::rule<It, std::vector<std::string>()> path = element % qi::char_(boost::phoenix::ref(delim)); // use it like: std::vector<std::string> data; bool ok = qi::parse(f, l, path, data);

{{1}}
相关问题