Skip to content

Instantly share code, notes, and snippets.

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