迭代镜头导致"模糊树迭代"

  • 本文关键字:迭代 模糊 augeas
  • 更新时间 :
  • 英文 :


在为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/ = /[^01-04n]*/ }
| ()/
' { "#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/ = /[^01-04n]*/ } | ()/

对于tree -> text方向,Augeas 讨论了它如何匹配树节点。该表示法使用{ LABEL_RX = VALUE_RX }来指示它尝试匹配标签与LABEL_RX匹配且其值与VALUE_RX匹配的树节点 — 树节点的子节点从不用于匹配。上述模式的第一部分(在|之前)匹配标签为#comment且值与[^01-04n]*匹配的树节点。(01-04是出于内部原因,Augeas 1.9 会压制它们)第二部分符合(),奥吉亚斯说"什么都没有"的方式。

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

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

一种方法是像这样修改镜头:

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

这摆脱了"模棱两可的树迭代",代价是空行也会在树中创建#comment节点(没有值)。但这可能是可以接受的。

相关内容

  • 没有找到相关文章

最新更新