【发布时间】:2020-04-03 08:26:28
【问题描述】:
我使用精神解析器已经很长时间了,但现在我遇到了一个我不太明白的问题。 我想将 a,b->c,d 或 a,b->d 之类的内容解析为结构。如果输入是 a,b->c,d(规则的左侧部分),则以下代码会正确执行此操作。但如果输入是 a,b->d(替代部分),则产生 aa,bb,,d。所以看起来替代解析器并没有清除已经解析的部分。
struct Test
{
std::string a;
std::string b;
std::string c;
std::string d;
};
BOOST_FUSION_ADAPT_STRUCT(Test,
(std::string, a)
(std::string, b)
(std::string, c)
(std::string, d))
using namespace boost::spirit::qi;
using std::string;
using std::pair;
rule<const char *, Test()> r = (+alnum >> ',' >> +alnum >> "->" >> +alnum >> ',' >> +alnum) | (+alnum >> ',' >> +alnum >> "->" >> attr(string()) >> +alnum);
Test result;
//const char* s = "a,b->c,d"; //produces a Result with a,b,c,d
const char* s = "a,b->d"; // procudes a Result with aa,bb,,d
parse(s, s + strlen(s), r, result);
【问题讨论】:
-
No rollback on backtracking 是一个常见问题,下次尝试使用搜索引擎,bugtracker 上有问题,有概要,解决方法github.com/boostorg/spirit/issues/378
标签: c++ parsing boost-spirit boost-spirit-qi