grammar SQLPrimitives include SQLTokens rule primitive OPEN_PARENS primitive CLOSE_PARENS { def eval simple_primitive.eval end } / simple_primitive end rule simple_primitive datetime / date / boolean / quoted_string / backtick_string / number / string end rule optional_spaces SPACE* end rule boolean TRUE / FALSE end rule quoted_string single_quoted_string / double_quoted_string end rule single_quoted_string SINGLE_QUOTE (NON_QUOTE_CHARS / DOUBLE_QUOTE)* SINGLE_QUOTE { def eval text_value[1..text_value.length-2] end } end rule double_quoted_string DOUBLE_QUOTE (NON_QUOTE_CHARS / SINGLE_QUOTE)* DOUBLE_QUOTE { def eval text_value[1..text_value.length-2] end } end rule string STRING_CHARS+ { def eval text_value end } end rule column_string STRING_CHARS_W_NON_XCLUSIVE_NUMS+ { def eval text_value.downcase end } end rule backtick_string BACKTICK string BACKTICK { def eval string.eval end } end rule backtick_column_string BACKTICK column_string BACKTICK { def eval column_string.eval end } end rule number float / integer end rule integer DASH? DIGIT* { def eval text_value.to_i end } end rule positive_integer DIGIT* { def eval text_value.to_i end } end rule float integer "." positive_integer { def eval text_value.to_f end } end rule date one:four_digits DASH two:two_digits DASH three:two_digits { def eval elements = [one.eval, two.eval, three.eval] Date.new(*elements) end } end rule four_digits two_digits two_digits { def eval; text_value.to_i; end } end rule two_digits DIGIT DIGIT { def eval; text_value.to_i; end } end rule datetime quote? date SPACE time quote? { def eval Time.parse(text_value) end } end rule time two_digits ":" two_digits ":" two_digits end rule quote SINGLE_QUOTE / DOUBLE_QUOTE end end