Sha256: 407e17e023ad2873654c8bcd925654fc6a4934c81f55658d3533536761ee5af6

Contents?: true

Size: 1.05 KB

Versions: 1

Compression:

Stored size: 1.05 KB

Contents

class Parslet::Expression::Treetop
  class Parser < Parslet::Parser
    root(:expression)
    
    rule(:expression) {
      alternatives
    }
    
    rule(:alternatives) {
      simple >> (spaced('/') >> alternatives) |
      simple
    }
    
    rule(:simple) {
      perhaps.repeat
    }

    rule(:perhaps) {
      atom.as(:maybe) >> spaced('?') | 
      atom
    }
    
    rule(:atom) { 
      spaced('(') >> expression.as(:unwrap) >> spaced(')') |
      string 
    }

    rule(:string) {
      str('\'') >> 
      (
        (str('\\') >> any) |
        (str("'").absnt? >> any)
      ).repeat.as(:string) >> 
      str('\'') >> space?
    }
    
    rule(:space) { match("\s").repeat(1) }
    rule(:space?) { space.maybe }
    
    def spaced(str)
      str(str) >> space?
    end
  end
  
  class Transform < Parser::Transform
    rule(:unwrap => simple(:u)) { u }
    rule(sequence(:s))          { |d| Parslet::Atoms::Sequence.new(*d[:s]) }
    rule(:maybe => simple(:m))  { |d| d[:m].maybe }
    rule(:string => simple(:s)) { |d| str(d[:s]) }
  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
parslet-0.10.1 lib/parslet/expression/treetop.rb