2017-03-21 13 views
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: 

私はaugparseをしようとしているもの見当がつかないので、私はAugeas' tree -> plaintext例外表記の表記のまわりで私の頭を取得することはできません言う。

誰でもレンズの説明や修正を手伝ってもらえますか? Augeasがここで言おうとしている何

答えて

0

は次のようになります。このパターンにはツリーノードに一致する方法についてtree -> text方向、Augeas会談については

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

にツリーに一致するようにしようとしていました。その表記法は{ LABEL_RX = VALUE_RX }を使用して、ラベルがLABEL_RXと一致し、値がVALUE_RX —に一致するツリーノードが一致すると試行することを示します。ツリーノードの子は決して照合に使用されません。上記のパターンの最初の部分(|の前)は、ラベルが#commentで、値が[^\001-\004\n]*に一致するツリーノードと一致します。 (\001-\004は内部的な理由のためにそこにあり、Augeas 1.9はそれらを抑えるでしょう)2番目の部分は()と一致し、Augeasの方法は「何もない」と言います。

反復について話すという事実は、繰り返しの中で上記の構成を見つけたことを意味します。つまり、後に*というものがあります。

ツリーノード{ "#comment" }が表示されている場合は、最初に()と一致しない部分と一致するかどうかを判断できません。逆の場合は#comment部分と一致するかどうかを判断できません。何もない部分をマッチングさせると、出力に物が入ることがあります(この場合、del_strレンズの\n)、Augeasは手を上げて不平を言っています。

本のうち一つの方法は、このようにレンズを変更することです:

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

この空行はまたに(値なし)#commentノードを作成した価格で、「あいまいな木の反復」を取り除きます木。しかしそれはおそらく受け入れられるでしょう。

+0

私たちが答えの前に見つけたとしても、これは非常に有益でした。どうもありがとう。 – balast