Search code examples
ruby-on-railsrubytreetop

Writing Treetop rule to parse input in any order


I'm looking for a way to write Treetop rules which will find some values in any order. So:

rule top
  # ?
end    

rule gender
  ('women'/'men') / ''
end

rule age_under
  ('under' age) / ''
end

rule age
  [0-9]+
end

I would like to parse these inputs:

"women under 10"
"under 10 women"
"under 10"
"women"

How can I achieve this ? Thanks


Solution

  • Here's an example of parsing in any order. The only trouble is you would have to handle duplicates by hand since Treetop doesn't have a rule for unordered-non-repeating elements.

    rule top
     ((gender / age_under) ' '?)*
    end
    
    rule gender
     'women' / 'men'
    end
    
    rule age_under
     'under ' age
    end
    
    rule age
     [0-9]+
    end