class SQLSearch::Parser
option
ignorecase
macro
BLANK [\ \t]+ STRING [^']+ APPROXNUM {INTNUM}\.{INTNUM} INTNUM \d+ COMPARISON (<>|=|[<][=]|[<]|[>][=]|[>]) NAME [A-z_]([A-z0-9_]*) YEARS \d+ MONTHS \d{2} DAYS \d{2} HOURS \d{2} MINUTES \d{2} SECONDS \d{2} UTC_OFFSET ([+-]{HOURS}:{MINUTES}|Z) TIME {YEARS}-{MONTHS}-{DAYS}T{HOURS}:{MINUTES}:{SECONDS}{UTC_OFFSET}
rule
{BLANK} {APPROXNUM} { [:APPROXNUM, text.to_f] } {INTNUM} { [:INTNUM, text.to_i] } '{TIME}' { [:TIME, DateTime.iso8601(text[1...-1])] } '{STRING}' { [:STRING, text[1...-1]] } IS { [:IS, text] } NOT { [:NOT, text] } NULL { [:NULL, text.upcase] } IN { [:IN, text] } OR { [:OR, text] } AND { [:AND, text] } BETWEEN { [:BETWEEN, text] } LIKE { [:LIKE, text] } {COMPARISON} { [:COMPARISON, text] } {NAME} { [:NAME, text] } \( { [:LPAREN, text] } \) { [:RPAREN, text] } \. { [:DOT, text] } \, { [:COMMA, text] } \+ { [:ADD, text] } \- { [:SUBTRACT, text] } \/ { [:DIVIDE, text] } \* { [:MULTIPLY, text] }
inner
def tokenize(code) scan_setup(code) tokens = [] while token = next_token tokens << token end tokens end
end