我想实现一个需要解析实例名称和路径的语法,其中路径是由分隔符分隔的实例名称列表。在列出路径之前,分隔符可以是输入文件中给出的.
(句点)或/
(斜杠),例如:
DIVIDER .
a.b.c
x.y.z
一旦设置,分隔符永远不会改变整个文件(即如果设置为.
,遇到类似a/b/c
的路径不应该正确解析)。由于我事先不知道分频器是什么,我考虑将它存储在我的语法变量中并在相应的char_
解析器中使用该值(当然,实际的语法是更复杂,但这是我遇到麻烦的部分。)
这有点类似于这个问题:Boost spirit using local variables但不完全是我想要的,因为使用Nabialek技巧可以解析"无效"设置分隔符后的路径。
我不是在这里要求一个完整的解决方案,但我的问题基本上是这样的:我可以将值解析为我的语法成员,然后使用这些值来进一步解析剩余的输入吗?
答案 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}}