在为德卡德测试编写镜头时,我遇到了一个问题。
这个镜头
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想说什么。
有人能帮我解释一下或修理一下镜头吗?
发布于 2017-04-26 00:14:38
Augeas在这里想说的是:它试图将一棵树与这种模式相匹配
/{ /#comment/ = /[^\001-\004\n]*/ } | ()/对于tree -> text方向,Augeas将讨论如何匹配树节点。该表示法使用{ LABEL_RX = VALUE_RX }表示它试图匹配一个树节点,其标记与LABEL_RX匹配,其值与VALUE_RX匹配--树节点的子节点从未用于匹配。上面模式的第一部分(在|之前)匹配一个树节点,该节点的标签是#comment,其值与[^\001-\004\n]*匹配。( \001-\004是出于内部原因而存在的,Augeas1.9将对其进行压制)第二部分与()、Augeas的“说什么”的方式相匹配。
它谈论迭代的事实意味着它在迭代中找到了上面的构造,即在迭代之后有一个*。
它遇到的问题是,如果它看到一个树节点{ "#comment" }:它无法决定它是否应该首先匹配() nothing部分,然后再匹配#comment部分,反之亦然。由于匹配nothing部分会导致输出(在本例中是来自del_str镜头的del_str)中,Augeas会举起手来抱怨。
其中一种方法是像这样修改镜头:
let eol = ws .
(del /[;#]/ ";" . [label "#comment" . store /[^\n]*/] . del_str "\n")* .
del_str "\n"这样就消除了“模糊树迭代”,代价是空行还会在树中创建#comment节点(没有值)。但这可能可以接受。
https://stackoverflow.com/questions/42933618
复制相似问题