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

时间:2015-06-04 16:20:17

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

我正在努力了解Qi Difference Parsers的行为。

有这样的事情:

ruleA = 
  ruleAa
| ruleAb
| ruleAc
;

ruleB =
ruleA - ruleAc
;

我想象如果输入匹配ruleAa或ruleAb,解析器将匹配ruleB。换句话说,ruleB将从ruleA中减去一个替代(ruleAc)。这是不正确的吗?

在我的代码中,我正在做类似上面的事情并且它编译但似乎没有像我预期的那样表现。我的实际用例涉及其他难以解决的因素。

从本质上讲,我正在尝试做的是: 我有一个像ruleA这样的规则,它包含一组备选方案。 这个规则在我的语法中的几个不同的地方使用。但在一个特定用途中,我需要避免引起其中一种选择。似乎差异解析器就是为了这个目的,但也许我误解了?

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

我想象如果输入匹配ruleAa或ruleAb,解析器将匹配ruleB。换句话说,ruleB将从ruleA中减去一个替代(ruleAc)。这是不正确的吗?

(A|B|C) - C仅相当于(A|B) iff C永远不会匹配(A|B)匹配的任何内容。

一个简单的例子,假设:

A = int_;
B = +space;
C = char_;

由于C始终与AB匹配的位置匹配,因此很明显,(A|B) - C始终无法匹配。 (A|B|C)-C也是如此。

简而言之 匹配A的任何BC不再与something - C匹配。< / p>

  

此规则在我的语法中的几个不同位置使用。但在一个特定用途中,我需要避免引起其中一种选择。似乎差异解析器就是为了这个目的

正如您在上面所见,事实并非如此。差异解析器根本没有/修改/左侧解析器。 (它只丢弃一些独立于左侧的比赛)。

我能想到的最好的事情是/只在一个地方使用/ (A|B),在另一个地方使用(A|B|C)。它真的那么简单: 说出你的意思