lib/predicator/parser.y in predicator-1.1.0 vs lib/predicator/parser.y in predicator-1.2.0

- old
+ new

@@ -2,12 +2,14 @@ options no_result_var token TRUE FALSE LPAREN RPAREN LBRACKET RBRACKET BANG NOT DOT COMMA AT AND OR - EQ GT LT BETWEEN IN + EQ GT LT BETWEEN IN PRESENT BLANK INTEGER STRING IDENTIFIER + DATE DURATION AGO FROMNOW + STARTSWITH ENDSWITH rule predicate : boolean_predicate | logical_predicate @@ -21,35 +23,70 @@ ; logical_predicate : BANG predicate { AST::Not.new val.last } | predicate AND predicate { AST::And.new val.first, val.last } | predicate OR predicate { AST::Or.new val.first, val.last } + | variable PRESENT { AST::Present.new val.first } + | variable BLANK { AST::Blank.new val.first } ; group_predicate : LPAREN predicate RPAREN { AST::Group.new val[1] } ; comparison_predicate - : value EQ value { AST::Equal.new val.first, val.last } - | value GT value { AST::GreaterThan.new val.first, val.last } - | value LT value { AST::LessThan.new val.first, val.last } - | value BETWEEN value AND value { AST::Between.new val.first, val[2], val.last } - | value IN array { AST::In.new val.first, val.last } - | value NOT IN array { AST::NotIn.new val.first, val.last } + : integer_comparison_predicate + | string_comparison_predicate + | date_comparison_predicate ; - array - : LBRACKET array_contents RBRACKET { AST::Array.new val[1] } + integer_comparison_predicate + : variable EQ integer { AST::IntegerEqual.new val.first, val.last } + | variable GT integer { AST::IntegerGreaterThan.new val.first, val.last } + | variable LT integer { AST::IntegerLessThan.new val.first, val.last } + | variable BETWEEN integer AND integer { AST::IntegerBetween.new val.first, val[2], val.last } + | variable IN integer_array { AST::IntegerIn.new val.first, val.last } + | variable NOT IN integer_array { AST::IntegerNotIn.new val.first, val.last } ; - array_contents - : literal - | array_contents COMMA literal { [val.first, val.last].flatten } + string_comparison_predicate + : variable EQ string { AST::StringEqual.new val.first, val.last } + | variable GT string { AST::StringGreaterThan.new val.first, val.last } + | variable LT string { AST::StringLessThan.new val.first, val.last } + | variable IN string_array { AST::StringIn.new val.first, val.last } + | variable NOT IN string_array { AST::StringNotIn.new val.first, val.last } + | variable STARTSWITH string { AST::StringStartsWith.new val.first, val.last } + | variable ENDSWITH string { AST::StringEndsWith.new val.first, val.last } ; - value - : literal - | variable + date_comparison_predicate + : variable EQ date { AST::DateEqual.new val.first, val.last } + | variable GT date { AST::DateGreaterThan.new val.first, val.last } + | variable LT date { AST::DateLessThan.new val.first, val.last } + | variable BETWEEN date AND date { AST::DateBetween.new val.first, val[2], val.last } ; - literal + integer_array + : LBRACKET integer_array_contents RBRACKET { AST::IntegerArray.new val[1] } + ; + integer_array_contents + : integer + | integer_array_contents COMMA integer { [val.first, val.last].flatten } + ; + string_array + : LBRACKET string_array_contents RBRACKET { AST::StringArray.new val[1] } + ; + string_array_contents + : string + | string_array_contents COMMA string { [val.first, val.last].flatten } + ; + integer + : INTEGER { AST::Integer.new val.first.to_i } + ; + string : STRING { AST::String.new val.first } - | INTEGER { AST::Integer.new val.first.to_i } + ; + date + : DATE { AST::Date.new val.first } + | duration AGO { AST::DateAgo.new val.first } + | duration FROMNOW { AST::DateFromNow.new val.first } + ; + duration + : DURATION { AST::Duration.new val.first } ; variable : IDENTIFIER { AST::Variable.new val.first } | variable DOT IDENTIFIER { AST::Variable.new [val.first, val.last].flatten.join(".") } ;