Hi Yclept.
> That is ambiguous concatenation - I removed "(store Rx.word)?" for clarity. Well, like I said, it was untested. Though this expression does pass the tests imposed by augparse: let match = [ Util.del_opt_ws "" . key Rx.word . Sep.space_equal . (store Rx.word)? . Util.comment_noindent? ] Yet I feel like you actually wanted to point out something different with your mail from the start and I cannot comment on that (I'm merely a subscriber to this list and not an Augeas developer). Best regards, Xavier. From: Yclept Nemo [mailto:[email protected]] Sent: Saturday, October 31, 2015 6:14 PM To: Mol, Xavier (SCC) Cc: augeas-devel Subject: Re: [augeas-devel] Matching key/value statement On Fri, Oct 30, 2015 at 4:13 AM, Mol, Xavier (SCC) <[email protected]> wrote: > let match = [ Util.del_opt_ws . key Rx.word . Sep.space_equal . (store > Rx.word)? . Util.comment_or_eol ] > > I haven't tested this, since you did not give a real word example either, so > try it for yourself. Hi, let match = [ Util.del_opt_ws "" . key Rx.word . Sep.space_equal . Util.comment_or_eol ] That is ambiguous concatenation - I removed "(store Rx.word)?" for clarity. In the put direction augeas differentiates lenses using child nodes, and nodes using key/value properties. This isn't documented and caused me lots of grief. For example lenses, ambiguous: [ (del "a" "a") | (del "b" "b") ] lenses, unambiguous: [ (del "a" "a") | (del "b" "b" . [ label "bleh" ]) ] nodes, ambiguous: [ label "a" . store /a/ ] | [ label "a" . store /a/ . del / / " " ] nodes, unambiguous: [ label "a" . store /a/ ] | ([ label "a" . store /a/ . del / / " " ] . [ label "bleh" ]) nodes, unambiguous: [ label "a" . store /a/ ] | [ label "a" . del / / " " ] This isn't some theoretical limitation, but a shortcoming of augeas. In the above examples, creating null placeholder nodes renders lenses unusable in the put direction [1], but unnecessary for this particular problem. The solution - move the node ambiguities to the lens level, and the lens ambiguities to the node level. These equivalent statements are both ambiguous: Node-level ambiguities: let record = [ key . spaces? . equal . spaces? ] | [ key . spaces? . equal . spaces? . comment ] | [ key . spaces? . equal . spaces? . value ] | [ key . spaces? . equal . spaces? . value . spaces? . comment ] Lens-level ambiguities: let record = [ key . spaces? . equal . spaces? . (comment | value | (value . spaces? . comment))? Merge the node-level ambiguities to create a lens without ambiguities: let record = [ key . spaces? . equal . spaces? . comment? ] | [ key . spaces? . equal . spaces? . value . (spaces . comment)? ] Note the flattened equivalent still has lens-level ambiguities: let record = [ key . spaces? . equal . spaces? . (comment? | value . (spaces? . comment)?) Anyway, the non-ambiguous version can be made easier to use via a constructor, and the default valueless placeholder changed from "key = " to "key =": let spaces = /[ \t]+/ " " let spaces_none = del /[ \t]*/ "" let recorder (prefix:lens) = let template (suffix:lens) = [ prefix . key . spaces? . equal . suffix ] in let suffix_empty = spaces_none | (spaces? . comment) in let suffix_value = spaces? . value . (spaces? . comment)? in let records = template suffix_empty | template suffix_value in records But the version I want is actually: let record = [ key . spaces? . equal . spaces_none ] | [ key . spaces? . equal . spaces? . comment ] | [ key . spaces? . equal . spaces? . value . spaces_none ] | [ key . spaces? . equal . spaces? . value . spaces? . comment ] Which simplifies to: let record = [ key . spaces? . equal . (spaces_none | (spaces? . comment)) ] | [ key . spaces? . equal . spaces? . value (spaces_none | (spaces? . comment)) ] And then, nicely without ambiguities, to: let record = [ key . spaces? . equal . (spaces? . value)? . (spaces_none | (spaces? . comment) ] I'm going to update my ConfigObj lenses soon with functional examples. Sincerely, [1] @augeas-devs: placeholder nodes that are ignored in the put direction would be *extremely* useful. Drawing inspiration from perl regexes, perhaps using modifier syntax such as "[?>lens]".
smime.p7s
Description: S/MIME cryptographic signature
_______________________________________________ augeas-devel mailing list [email protected] https://www.redhat.com/mailman/listinfo/augeas-devel
