提振精神:通过改变局部变量值来解析 char_

Boost spirit: Parse char_ with changing local variable value

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

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

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

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

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

我会使用继承的属性:

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

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

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

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);