citrus icon indicating copy to clipboard operation
citrus copied to clipboard

Trouble flattening lists

Open dbarowy opened this issue 15 years ago • 1 comments

Hi Michael,

Any idea how to do list flattening in a straightforward way with nested rules? If I use the construct below with the input "foo1 foo2 foo3" and then call the value method on my tree, I get "Stack level too deep". Seems that Things will call the morethings method on itself instead of on the matched substring. This appears to be a bug, but maybe I've missed something here...

I can make it work if I add a second rule so that the two rules alternate, but it sure does make the grammar file ugly!

Many thanks, Dan

grammar SampleGrammar rule ROOT (things:Things WS* EOF) { def value list = [] list += things.value return list end } end

rule Things
    (thing:THING WS* (morethings:Things)?)
    {
        def value
            list = []
            list << thing.value
            list += morethings.value unless morethings.nil?
            return list
        end
    }
end

rule THING
    [a-zA-Z0-9]+
end

rule EOF
    !.
end

rule WS
    [\s\t\r\n\f] 
end

end

dbarowy avatar Feb 05 '11 01:02 dbarowy

It works if you do it like this:

list += morethings.matches.first.value unless morethings.matches.first.nil?

rogerbraun avatar Feb 20 '11 21:02 rogerbraun