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(".") }
;