0

在为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:

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

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

4

1 回答 1

0

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

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

对于tree -> text方向,Augeas 谈到了它是如何匹配树节点的。该符号用于{ LABEL_RX = VALUE_RX }表示它尝试匹配标签匹配LABEL_RX且值匹配VALUE_RX的树节点——树节点的子节点永远不会用于匹配。上述模式的第一部分(在 之前)匹配一个标签为且值匹配|的树节点。(由于内部原因,Augeas 1.9 将抑制它们)第二部分匹配,Augeas 说“无”的方式。#comment[^\001-\004\n]*\001-\004()

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

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

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

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

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

于 2017-04-26T00:14:38.447 回答