在为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
试图说什么。
任何人都可以帮我解释或修复镜头吗?
答案 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"
个节点(没有值)。但这可能是可以接受的。