[augeas-devel] [Augeas] #253: Match oddities in recursive lens

Augeas trac at fedorahosted.org
Mon Feb 6 22:45:03 UTC 2012


#253: Match oddities in recursive lens
---------------------+---------------------
 Reporter:  raphink  |       Owner:  lutter
     Type:  defect   |      Status:  new
 Priority:  major    |   Milestone:  next
Component:  Augeas   |     Version:  devel
 Keywords:           |  Blocked By:
 Blocking:           |
---------------------+---------------------
 As I was making graphviz.aug, I noticed a weird behavior with recursive
 lenses.

 Using `graphviz.aug` as of 810b8b65bfaf68bc83dfa871adeb9b3b48fc4eb9, we
 have:

 {{{
 (* View: subgraph
      Recursive mode doesn't work in the put direction
      so this is resctricted to two levels for now.
      TODO: See why recursive mode won't work. *)
 let subgraph = block "subgraph" (subgraph_nonrec | entry)

 (* View: graph
      The top-level graph
      Use <subgraph_nonrec> for debug *)
 let graph = block /(di)?graph/ (subgraph | entry) . Util.eol
 }}}

 which works, but only supports two levels of recursion for `subgraph`s
 (beware, this non-recursive lens requires about 6GB of RAM to typecheck).
 To turn on recursion, set `subgraph` to:

 {{{
 let rec subgraph = block "subgraph" (subgraph | entry)
 }}}

 Now, the typechecking fails with:

 {{{
 Syntax error in lens definition
 graphviz.aug:117.0-.77:Failed to compile lns
 graphviz.aug:117.10-.77:exception: ambiguous tree concatenation
       First regexp: /({ /#comment/ = /[^\001-\004\t\n
 ][^\001-\004\n]*[^\001-\004\t\n ]|[^\001-\004\t\n ]/ } | { })*{
 /(di)?graph/ = /"[^\001-\004"]*"|[.0-9A-Z_a-z]+/ }/
       Second regexp: /({ /#comment/ = /[^\001-\004\t\n
 ][^\001-\004\n]*[^\001-\004\t\n ]|[^\001-\004\t\n ]/ } | { })*/
       ' { "#comment" = "AA" }' can be split into
       '|=| { "#comment" = "AA" }'

      and
       ' { "#comment" = "AA" }|=|'

     First lens: graphviz.aug:117.10-.46:
     Second lens: graphviz.aug:117.49-.77:
 }}}

 This is a first hint into the issue. If we remove the `(Util.comment |
 Util.empty)*` at the end of the `graph` definition such that we get:

 {{{
 let lns = (Util.comment | Util.empty)* . graph
 }}}

 then typechecking passes, but `test_graphviz.aug` returns:

 {{{
 tests/test_graphviz.aug:45.0-52.0:exception thrown in test
 tests/test_graphviz.aug:45.5-46.36:exception: Failed to match
     ({ /#comment/ = /[^\001-\004\t\n ][^\001-\004\n]*[^\001-\004\t\n
 ]|[^\001-\004\t\n ]/ } | { })*{ /(di)?graph/ = /"[^\001-\004"]*"|[.0-9A-
 Z_a-z]+/ }
   with tree
     { "graph" = "A" }
     Lens: ./graphviz.aug:117.10-.46:
     Error encountered at path

 Syntax error in lens definition
 Failed to load tests/test_graphviz.aug
 }}}

 which seems like a similar error to the one involving `Util.comment`
 above.

-- 
Ticket URL: <https://fedorahosted.org/augeas/ticket/253>
Augeas <http://augeas.net/>
a configuration API




More information about the augeas-devel mailing list