Skip to content

Instantly share code, notes, and snippets.

@d11wtq
Created December 4, 2011 01:51
Show Gist options
  • Save d11wtq/1428828 to your computer and use it in GitHub Desktop.
Save d11wtq/1428828 to your computer and use it in GitHub Desktop.
class QueryParser < Whittle::Parser
rule(:wsp => /\s+/).skip!
rule("(")
rule(")")
rule("AND") % :left
rule("OR") % :left
rule(">") % :left ^ 1
rule("<") % :left ^ 1
rule(:id => /[a-zA-Z_][a-zA-Z0-9_]*/)
rule(:int => /[0-9]+/)
rule(:bool_op) do |r|
r["AND"]
r["OR"]
end
rule(:comp_op) do |r|
r[">"].as { "GT" }
r["<"].as { "LT" }
end
rule(:expr) do |r|
r["(", :expr, ")"].as { |_, expr, _| expr }
r[:expr, :bool_op, :expr].as { |a, op, b| { :fname => op, :left => a, :right => b } }
r[:expr, :comp_op, :expr].as { |a, op, b| { :fname => op, :left => a, :right => b } }
r[:id]
r[:int]
end
start(:expr)
end
pp QueryParser.new.parse("5 < 6 AND zip < button AND moon > spoon")
# =>
# {:fname=>"AND",
# :left=>
# {:fname=>"AND",
# :left=>{:fname=>"LT", :left=>"5", :right=>"6"},
# :right=>{:fname=>"LT", :left=>"zip", :right=>"button"}},
# :right=>{:fname=>"GT", :left=>"moon", :right=>"spoon"}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment