迭代镜头导致 'ambiguous tree iteration'

Iterated lens leads to 'ambiguous tree iteration'

在为 Deckard 测试编写镜头时,我 运行 遇到了问题。

这个镜头

let eol = ws . ((del /[;#]/ ";" . [label "#comment" . store /[^\n]*/] 
          . del_str "\n") | (del_str "\n"))* . del_str "\n"

导致此错误:

$ augparse /usr/share/augeas/lenses/dist/deckard.aug
Syntax error in lens definition
/usr/share/augeas/lenses/dist/deckard.aug:22.0-.119:Failed to compile eol
/usr/share/augeas/lenses/dist/deckard.aug:22.15-.104:exception: ambiguous tree iteration
  Iterated regexp: /     { /#comment/ = /[^[=12=]1-[=12=]4\n]*/ }
  | ()/
  ' { "#comment" }' can be split into
  '|=| { "#comment" }'

 and
  ' { "#comment" }|=|'

Iterated lens: /usr/share/augeas/lenses/dist/deckard.aug:22.15-.102:

我无法理解 Augeas 的 tree -> plaintext 异常符号,所以我不知道 augparse 想说什么。

谁能帮我解释或修复镜头?

Augeas 在这里想说的是:它试图将一棵树与这种模式相匹配

/{ /#comment/ = /[^[=10=]1-[=10=]4\n]*/ } | ()/

对于tree -> text方向,Augeas讲了它是如何匹配树节点的。该表示法使用 { LABEL_RX = VALUE_RX } 表示它尝试匹配标签匹配 LABEL_RX 且值匹配 VALUE_RX 的树节点——树节点的子节点永远不会用于匹配。上述模式的第一部分(在 | 之前)匹配一个树节点,其标签为 #comment,其值匹配 [^[=18=]1-[=18=]4\n]*。 ([=19=]1-[=19=]4 是出于内部原因,Augeas 1.9 会抑制它们)第二部分匹配 (),Augeas 的表达方式 'nothing'.

它谈论迭代的事实意味着它在迭代中找到了上述构造,即后面有 * 的东西。

它遇到的问题是,如果它看到一个树节点 { "#comment" }:它无法决定是否应该先匹配 () nothing 部分,然后再匹配 #comment 部分,反之亦然。由于匹配nothing部分会导致东西被放入输出(在这种情况下,\n来自del_str镜头),Augeas举起手来抱怨它。

解决这个问题的一种方法是像这样修改镜头:

let eol = ws . 
        (del /[;#]/ ";" . [label "#comment" . store /[^\n]*/] . del_str "\n")* .
        del_str "\n"

这摆脱了 'ambiguous tree iteration',代价是空行还会在树中创建 #comment 个节点(没有值)。但这可能是可以接受的。