【问题标题】:Iterated lens leads to 'ambiguous tree iteration'迭代镜头导致“模棱两可的树迭代”
【发布时间】:2017-03-21 16:58:08
【问题描述】:

在为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 想说什么。

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

【问题讨论】:

    标签: augeas


    【解决方案1】:

    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" }:它无法决定是否应该首先匹配() nothing 部分,然后是#comment 部分,反之亦然。由于匹配空的部分会导致东西被放入输出中(在这种情况下,来自del_str 镜头的\n),Augeas 举起手来抱怨它。

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

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

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

    【讨论】:

    • 这是非常有用的信息,即使我们在回答之前就知道了。非常感谢。
    猜你喜欢
    • 2018-06-21
    • 2020-07-17
    • 2010-11-30
    • 2021-08-24
    • 2023-03-07
    • 2015-07-23
    • 2014-06-30
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多