Skip to content

Instantly share code, notes, and snippets.

@andyl
Created June 4, 2011 01:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andyl/1007424 to your computer and use it in GitHub Desktop.
Save andyl/1007424 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'parslet'
class Address < Parslet::Parser
# Single character rules
rule(:comma) { str(',') >> space? }
rule(:space) { match('\s').repeat }
rule(:space?) { space.maybe }
rule(:newline) { str("\n").repeat }
rule(:digit) { match('[0-9]') }
# Things
rule(:line1) { (match('[A-z0-9 ]').repeat).as(:address1) }
rule(:line2) { newline >> (match('[A-z0-9 ]').repeat).as(:address2) }
rule(:word) { match('[A-z]').repeat }
rule(:capword) { space >> match['A-Z'] >> match['a-z'].repeat(1) }
# Address Parts
rule(:address) { line1 >> line2.maybe }
rule(:state) { (str("CA") | str("CO")).as(:state) }
rule(:zip) { digit.repeat(5,5).as(:zip) }
rule(:city) { (word >> capword.maybe).as(:city) }
rule(:sz) { state >> space.maybe >> zip }
rule(:csz) { city >> space >> state >> space >> zip.maybe }
rule(:all) { address >> newline >> csz }
root :all
end
p Address.new.comma.parse(",")
p Address.new.digit.parse("5")
p Address.new.zip.parse("94022")
p Address.new.state.parse("CA")
p Address.new.state.parse("CO")
p Address.new.sz.parse("CA 94022")
p Address.new.csz.parse(" CA 94022")
p Address.new.csz.parse("Mountain CA 94022")
p Address.new.csz.parse("Mountain View CA 94022")
p Address.new.csz.parse("SF CA 94022")
p Address.new.csz.parse("SF CA")
p Address.new.address.parse("1523 Broker Way")
p Address.new.address.parse("1523 Broker Way\nApartment 22")
p Address.new.all.parse("1523 Broker Way\nApartment 22\nMountain View CA 94022")
p Address.new.all.parse("1523 Broker Way\nMountain View CA 94022")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment