RubyPeg
RubyPeg helps you to create readable Parsing Expression Grammars (PEG) in ruby.
This software is (c) 2010 Green on Black Ltd and distributed under the open source MIT licence. (See LICENCE for the wording).
If you like this code, employ us: http://www.greenonblack.com
An example
class Arithmetic < RubyPeg
def root
arithmetic
end
def arithmetic
node :arithmetic do
one_or_more { expression } && ignore { terminal(/\z/) }
end
end
def expression
subtraction || addition || division || multiplication || brackets || number
end
def brackets
node :brackets do
ignore { terminal("(") } && spacing && expression && spacing && ignore { terminal(")") }
end
end
def multiplication
node :multiplication do
(brackets || number) && spacing && ignore { terminal("*") } && spacing && expression
end
end
def division
node :division do
(brackets || number) && spacing && ignore { terminal("/") } && spacing && expression
end
end
def addition
node :addition do
(brackets || number) && spacing && ignore { terminal("+") } && spacing && expression
end
end
def subtraction
node :subtraction do
(brackets || number) && spacing && ignore { terminal("-") } && spacing && expression
end
end
def number
terminal(/[-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?/)
end
def spacing
ignore { terminal(/[ \t]*/) }
end
end
Arithmetic.parse("(1+1)+2").to_ast # [:arithmetic,[:addition,[:brackets,[:addition,'1','1']],'2']]