感谢用户“ sehe”的帮助,现在我可以编译ast了。

(请参阅此处: https : //stackoverflow.com/a/29301655/1835623

现在,从我需要解析的JEDEC文件中提取的数据字段之一如下所示:

“ 12345 0000100101010111011010110101011010”

我已经建立了一个解析器来使用这些类型的字段:

std::string input("12345 010101010101010101010");
std::string::iterator st = input.begin();

qi::parse(st, input.end(), qi::ulong_ >> ' ' >> *qi::char_("01"));

显然没有那么复杂。 现在我的问题是我想使用语义操作将ulong_和二进制字符串分配给某些局部变量。 这是我所做的:

using boost::phoenix::ref;

std::string input("12345 010101010101010101010");
std::string::iterator st = input.begin();

uint32_t idx;
std::string sequence;
qi::parse(st, input.end(),
          qi::ulong_[ref(idx) = qi::_1] >>
          ' ' >>
          *qi::char_("01")[ref(sequence) += qi::_2]);

但是不幸的是,这甚至无法编译,并且我得到的错误消息没有帮助(至少对我而言)? 我想这很简单...但是我现在无可救药了。 :-(

有人知道我在做什么错吗?

#1楼 票数:1 已采纳

两种方式:

  1. 修复SA的

     qi::parse(st, input.end(), qi::ulong_[ref(idx) = qi::_1] >> ' ' >> qi::as_string[*qi::char_("01")] [phx::ref(sequence) += qi::_1]); 

    笔记:

    • 它是qi::_1因为SA附加到的表达式不会公开两个元素,而只是一个
    • 明确是 phx::ref因为否则ADL¹会选择std::ref (因为std::string
    • 使用as_string强制来自std::vector<char>的属性类型


  2. 但是,当然,一如既往: 增强精神:“语义行为是邪恶的”?

     qi::parse(st, input.end(), qi::ulong_ >> ' ' >> *qi::char_("01"), idx, sequence ); 

    使用解析器API将引用绑定到属性。

¹ 什么是“依赖于参数的查询”(又名ADL或“ Koenig查找”)?

  ask by fhw72 translate from so

未解决问题?本站智能推荐:

1回复

如何捕获由boost::spirit::x3解析器解析的值以在语义动作的主体中使用?

我有一个字符串文字解析器,我想将语义操作附加到将操作解析值的解析器。 似乎boost::spirit::x3::_val()在给定上下文时返回对解析值的引用,但由于某种原因,解析的字符串总是作为空字符串进入语义动作的主体,这显然使其难以阅读。 虽然它是正确的字符串,但我已经通过检查地址来确定。 任何
1回复

使用boost.spirit.parser时无法解密编译错误

我正在尝试学习使用boost.spirit解析器进行解析。 我正在将Windows 8.1与VisualStudio 2015一起使用。我已经从boost.spirit安装文档中安装并成功编译了测试程序,因此我的boost安装似乎很好。 我一直在遵循关于使用paser的boost.org上
1回复

了解Boost.spirit的字符串解析器

该程序输出aa 。 这怎么可能? 输入字符串是a 。 解析器应匹配aa或a 。 我只为测试运营商编写了string("a") 。 使用char_而不是string 。
1回复

boost::spirit::qi差异解析器行为

我正在尝试了解Qi的差分解析器的行为。 用这样的东西: 我在想,如果输入匹配ruleAa或ruleAb,则解析器将匹配ruleB。 换句话说,ruleB将从ruleA中减去一个替代项(ruleAc)。 这不正确吗? 在我的代码中,我正在执行类似上面的操作,并且可以编译,但似乎未达
1回复

Boost.Spirit.Qi替代(|)解析器问题

我正在编写一个Qi解析器来解析IRC消息,并记录RFC 2812 。 在语法中有一个完全替代的替代: ( 此处为Coliru的完整代码 ) 我迷惑地看到,我的测试字符串( "Dz!Dz@mib-A3A026FF.rev.sfr.net" )相匹配nickUserHost ,而不是pre
1回复

使用boost-spirit的功能解析器

我正在尝试使用Boost Spirit解析函数。 当我尝试将匹配函数保存到字符串中时,出现编译错误。 Parser.cpp:50:58:错误:重载的ref(std :: string&)调用不明确int_ [ref(a)= _1] >> p.definedFunctions
4回复

使用Boost::spirit编写的解析器的性能问题

我想解析一个看起来像这样的文件(类似FASTA的文本格式): >InfoHeader "Some text sequence that has a line break after every 80 characters" >InfoHeader "Some
1回复

Boost::spirit(经典)原语与自定义解析器

我是Boost :: spirit的初学者,我想定义解析TTCN语言的语法。 ( http://www.trex.informatik.uni-goettingen.de/trac/wiki/ttcn-3_4.5.1 )我正在尝试为“原始”解析器定义一些规则,例如Alpha,AlphaNum