迭代镜头导致 '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
个节点(没有值)。但这可能是可以接受的。
在为 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
个节点(没有值)。但这可能是可以接受的。