Skip to content

Instantly share code, notes, and snippets.

@dpick
Created July 13, 2011 04:01
Show Gist options
  • Save dpick/1079696 to your computer and use it in GitHub Desktop.
Save dpick/1079696 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'parslet'
class Mini < Parslet::Parser
root(:lines)
rule(:lines) { line.repeat }
rule(:line) { (title | ingredient | step) >> newline.maybe }
rule(:title) { str('#') >> space.maybe >> (newline.absent? >> any).repeat.as(:title) }
rule(:ingredient) { str('*') >> space.maybe >> (newline.absent? >> any).repeat.as(:ingredient) }
rule(:step) { (match("\\d").repeat.as(:number) >> str(".") >> space.maybe >> (newline.absent? >> any).repeat).as(:step) }
rule(:newline) { str("\n") >> str("\r").maybe }
rule(:space) { match('\s').repeat(1) }
end
def parse(str)
mini = Mini.new
puts "Parsing #{str}: "
p mini.parse(str)
rescue Parslet::ParseFailed => error
puts error, mini.root.error_tree
end
recipe = "#test title\n*hi there\n* ingredient 2\n1. step 1\n42. step 42"
p parse(recipe) # => [{:title=>"test title"@1}, {:ingredient=>"hi there"@13}, {:ingredient=>"ingredient 2"@24}, {:step=>{:number=>"1"@37}}, {:step=>{:number=>"42"@47}}]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment