Skip to content

Instantly share code, notes, and snippets.

@kschiess
Created November 4, 2011 10:02
Show Gist options
  • Save kschiess/1339032 to your computer and use it in GitHub Desktop.
Save kschiess/1339032 to your computer and use it in GitHub Desktop.
Extends Mini-Parser from Getting Started to be able to use funcalls wherever a simple integer would do
require 'pp'
require 'parslet'
require 'parslet/convenience'
class MiniP < Parslet::Parser
# Single character rules
rule(:lparen) { str('(') >> space? }
rule(:rparen) { str(')') >> space? }
rule(:comma) { str(',') >> space? }
rule(:space) { match('\s').repeat(1) }
rule(:space?) { space.maybe }
# Things
rule(:integer) { match('[0-9]').repeat(1).as(:int) >> space? }
rule(:identifier) { match['a-z'].repeat(1) }
rule(:operator) { match('[+]') >> space? }
# New
rule(:term) { integer | funcall }
# Grammar parts
rule(:sum) { term.as(:left) >> operator.as(:op) >> expression.as(:right) }
rule(:arglist) { expression >> (comma >> expression).repeat }
rule(:funcall) { identifier.as(:funcall) >> lparen >> arglist.as(:arglist) >> rparen }
rule(:expression) { sum | term }
root :expression
end
pp MiniP.new.parse_with_debug('add(add(1, 2) + add(3, 4), add(5, 6))')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment