gpt4 book ai didi

c++ - 振奋 spirit : Parse char_ with changing local variable value

转载 作者:行者123 更新时间:2023-11-30 02:26:53 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

我会使用继承的属性:

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

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

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

关于c++ - 振奋 spirit : Parse char_ with changing local variable value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42301467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com