Skip to content

Instantly share code, notes, and snippets.

@jodell
Created December 18, 2009 04:52
Show Gist options
  • Save jodell/259298 to your computer and use it in GitHub Desktop.
Save jodell/259298 to your computer and use it in GitHub Desktop.
# 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