Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

43 lines (36 sloc) 0.919 kb
# A small example that demonstrates the power of tree pattern matching. Also
# uses '.as(:name)' to construct a tree that can reliably be matched
# afterwards.
$:.unshift '../lib'
require 'pp'
require 'parslet'
module LISP # as in 'lots of insipid and stupid parenthesis'
class Parser < Parslet::Parser
rule(:balanced) {
str('(').as(:l) >> balanced.maybe.as(:m) >> str(')').as(:r)
}
root(:balanced)
end
class Transform < Parslet::Transform
rule(:l => '(', :m => simple(:x), :r => ')') {
# innermost :m will contain nil
x.nil? ? 1 : x+1
}
end
end
parser = LISP::Parser.new
transform = LISP::Transform.new
%w!
()
(())
((((()))))
((())
!.each do |pexp|
begin
result = parser.parse(pexp)
puts "#{"%20s"%pexp}: #{result.inspect} (#{transform.apply(result)} parens)"
rescue Parslet::ParseFailed => m
puts "#{"%20s"%pexp}: #{m}"
end
puts
end
Jump to Line
Something went wrong with that request. Please try again.