提升精神:如何解析直到我们有“->”

Posted

技术标签:

【中文标题】提升精神:如何解析直到我们有“->”【英文标题】:boost spirit: how to parse until we have "->" 【发布时间】:2012-11-22 08:40:23 【问题描述】:

我正在尝试解析 predicate -> action 形式的 rule

我的问题是predicate 可以是任何有效的数学表达式,因此它实际上可能包含一个减号或一个更大的符号(但我们必须按顺序禁止它们,因为这是我们的标记想将predicateaction 分开)。

基本上,我希望predicate 消耗所有非空格,直到它碰到字符串"->"

我该怎么做?

是修复我在下面评论的行的正确方法还是我应该更好地定义 predicate 是什么,就有效表达式而言,并让解析器在 predicate 结束时落入 "->",根据到那个有效的表达?

rule %=
  predicate
  >> "->"
  >> action
  ;

predicate %= (+~(qi::char_("-"))); // BAD: works only if no minus sign in predicate
action    %= (+(qi::char_));

【问题讨论】:

【参考方案1】:

改写predicate如下:

predicate = +(qi::char_ - "->"); 
action    = +(qi::char_);

等价

predicate = +(!qi::lit("->") >> qi::char_); 

应该这样做。

查看文档

Difference Parser (a - b) Not-Predicate Parser (!a)

【讨论】:

以上是关于提升精神:如何解析直到我们有“->”的主要内容,如果未能解决你的问题,请参考以下文章

提升精神语义动作参数

提升精神词位及其属性

提升精神:将结果复制到字符串向量中

如何用“心流”提升编码工作效率?

提升精神 x3 变体和 std::pair

提升精神提取第一个单词并将其存储在向量中