Created
December 18, 2009 04:52
-
-
Save jodell/259298 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Parsing Expression Grammar for basic boolean logic on a set of k -> { v1, v2, ... } elements. | |
# Amazing talk about Treetop and PEG's: http://rubyconf2007.confreaks.com/d1t1p5_treetop.html | |
# | |
# lst = { | |
# 'foo' => [1, 2], | |
# 'bar' => [2, 3, 4], | |
# 'baz' => [5, 6] | |
# } | |
# | |
# require 'treetop' | |
# Treetop.load 'below_file' | |
# SetBoolParser.new.parse("! (foo && bar)").eval(lst) # => [1, 3, 4, 5, 6] | |
# SetBoolParser.new.parse("foo || bar && baz").eval(lst) # => [1, 2] | |
# | |
# -jf | |
grammar SetBoolGrammar | |
rule logical_or | |
lhs:logical_and space '||' space rhs:logical_or { | |
def eval(set) | |
lhs.eval(set) | rhs.eval(set) | |
end | |
} | |
/ | |
logical_and | |
/ | |
logical_not | |
end | |
rule logical_and | |
lhs:logical_not space '&&' space rhs:logical_and { | |
def eval(set) | |
lhs.eval(set) & rhs.eval(set) | |
end | |
} | |
/ | |
logical_not | |
end | |
rule logical_not | |
'!' space rhs:primary { | |
def eval(set) | |
set.values.flatten - (rhs.eval(set) || [nil]) | |
end | |
} | |
/ | |
primary | |
end | |
rule primary | |
key | |
/ | |
'(' space logical_or space ')' { | |
def eval(set) | |
logical_or.eval(set) | |
end | |
} | |
end | |
rule key | |
[a-zA-Z]+ { | |
def eval(set) | |
set[text_value] | |
end | |
} | |
end | |
rule space | |
' '* | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment