123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- %{
- #include <stdio.h>
- #include <string.h>
- #include "expression.h"
- #include "lexer.h"
- #include "filter.h"
- void yyerror(const char *str)
- {
- fprintf(stderr,"Parse error: %s\n",str);
- }
-
- int yywrap()
- {
- return 1;
- }
- extern node_t *zfilter;
- %}
- %union {
- int int_literal;
- char *string_literal;
- struct node_st *expr;
- }
- %token '(' ')' T_AND T_OR
- %token <int_literal> T_NUMBER
- %token <string_literal> T_FIELD
- %token T_NOT_EQ T_GT_EQ '>' '<' '=' T_LT_EQ
- %left T_OR
- %left T_AND
- %type <expr> filter
- %type <expr> number_filter
- %type <expr> string_filter
- %type <expr> filter_expr
- %%
- expression: filter_expr
- {
- zfilter = $1;
- }
- filter_expr:
- filter_expr T_OR filter_expr
- {
- $$ = make_op_node(OR);
- $$->left_child = $1;
- $$->right_child = $3;
- }
- | filter_expr T_AND filter_expr
- {
- $$ = make_op_node(AND);
- $$->left_child = $1;
- $$->right_child = $3;
- }
- | '(' filter_expr ')'
- {
- $$ = $2;
- }
- | filter
- {
- $$ = $1;
- }
- ;
- filter: number_filter
- {
- $$ = $1;
- }
- | string_filter
- {
- $$ = $1;
- }
- ;
- number_filter: T_FIELD '=' T_NUMBER
- {
- $$ = make_op_node(EQ);
- $$->left_child = make_field_node($1);
- $$->right_child = make_int_node($3);
- }
- |
- T_FIELD '>' T_NUMBER
- {
- $$ = make_op_node(GT);
- $$->left_child = make_field_node($1);
- $$->right_child = make_int_node($3);
- }
- |
- T_FIELD '<' T_NUMBER
- {
- $$ = make_op_node(LT);
- $$->left_child = make_field_node($1);
- $$->right_child = make_int_node($3);
- }
- |
- T_FIELD T_NOT_EQ T_NUMBER
- {
- $$ = make_op_node(NEQ);
- $$->left_child = make_field_node($1);
- $$->right_child = make_int_node($3);
- }
- |
- T_FIELD T_GT_EQ T_NUMBER
- {
- $$ = make_op_node(GT_EQ);
- $$->left_child = make_field_node($1);
- $$->right_child = make_int_node($3);
- }
- |
- T_FIELD T_LT_EQ T_NUMBER
- {
- $$ = make_op_node(LT_EQ);
- $$->left_child = make_field_node($1);
- $$->right_child = make_int_node($3);
- }
- ;
- string_filter:
- T_FIELD '=' T_FIELD
- {
- $$ = make_op_node(EQ);
- $$->left_child = make_field_node($1);
- $$->right_child = make_string_node($3);
- }
- |
- T_FIELD T_NOT_EQ T_FIELD
- {
- $$ = make_op_node(NEQ);
- $$->left_child = make_field_node($1);
- $$->right_child = make_string_node($3);
- }
- ;
- %%
|