【问题标题】:Parsing into structs with qi and alternative parts使用 qi 和替代部分解析结构
【发布时间】: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);

【问题讨论】:

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


【解决方案1】:

把它做成一个独立的复制品:

Live On Wandbox

#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted.hpp>
#include <iomanip>
#include <iostream>

namespace qi = boost::spirit::qi;

struct Test { std::string a, b, c, d; };
BOOST_FUSION_ADAPT_STRUCT(Test, a,b,c,d)

int main() {
    qi::rule<const char *, Test()> static const r 
        = (+qi::alnum >> ',' >> +qi::alnum >> "->" >> +qi::alnum >> ',' >> +qi::alnum)
        | (+qi::alnum >> ',' >> +qi::alnum >> "->" >> qi::attr(std::string()) >> +qi::alnum);

    for (auto input : {
        "a,b->c,d",
        "a,b->d"
    }) {
        Test result;
        qi::parse(input, input + strlen(input), r, result);
        for (auto const& part: { result.a, result.b, result.c, result.d })
            std::cout << " " << std::quoted(part);
        std::cout << "\n";
    }
}

打印

 "a" "b" "c" "d"
 "aa" "bb" "" "d"

所以,你的问题类似于:

常见的解决方案是qi::hold[],它有一些开销,但通常可以:

qi::rule<const char *, Test()> static const r 
    = qi::hold [+qi::alnum >> ',' >> +qi::alnum >> "->" >> +qi::alnum >> ',' >> +qi::alnum]
    | (+qi::alnum >> ',' >> +qi::alnum >> "->" >> qi::attr(std::string()) >> +qi::alnum);

哪个打印 Live On Wandbox

 "a" "b" "c" "d"
 "a" "b" "" "d"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多