首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代透镜导致“模糊树迭代”

迭代透镜导致“模糊树迭代”
EN

Stack Overflow用户
提问于 2017-03-21 16:58:08
回答 1查看 57关注 0票数 0

在为德卡德测试编写镜头时,我遇到了一个问题。

这个镜头

代码语言:javascript
复制
let eol = ws . ((del /[;#]/ ";" . [label "#comment" . store /[^\n]*/] 
          . del_str "\n") | (del_str "\n"))* . del_str "\n"

导致此错误:

代码语言:javascript
复制
$ 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想说什么。

有人能帮我解释一下或修理一下镜头吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-26 00:14:38

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

代码语言:javascript
复制
/{ /#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会举起手来抱怨。

其中一种方法是像这样修改镜头:

代码语言:javascript
复制
let eol = ws . 
        (del /[;#]/ ";" . [label "#comment" . store /[^\n]*/] . del_str "\n")* .
        del_str "\n"

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42933618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档