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

时间:2017-03-21 16:58:08

标签: 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/ = /[^\001-\004\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试图说什么。

任何人都可以帮我解释或修复镜头吗?

1 个答案:

答案 0 :(得分:0)

Augeas在这里试图说的是:它试图将树匹配到这种模式

/{ /#comment/ = /[^\001-\004\n]*/ } | ()/

对于tree -> text方向,Augeas谈论它如何匹配树节点。该表示法使用{ LABEL_RX = VALUE_RX }表示它尝试匹配其标签与LABEL_RX匹配且其值与VALUE_RX匹配的树节点 - 树节点的子节点从不用于匹配。上述模式的第一部分(在|之前)匹配标签为#comment且值与[^\001-\004\n]*匹配的树节点。 (由于内部原因,\001-\004存在,而Augeas 1.9将禁止它们)第二部分匹配(),Augeas'方式说“什么都没有”。

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

它遇到麻烦的是,如果它看到一个树节点{ "#comment" }:它无法决定它是否应首先匹配()无任何部分,然后{{1}部分反之亦然。由于匹配任何部分都可能导致事物被输入输出(在这种情况下,来自#comment镜头的\n),Augeas举起手来抱怨它。

除此之外的一种方法是修改镜头:

del_str

这消除了“模糊的树迭代”,其代价是空行还在树中创建let eol = ws . (del /[;#]/ ";" . [label "#comment" . store /[^\n]*/] . del_str "\n")* . del_str "\n" 个节点(没有值)。但这可能是可以接受的。