-
Notifications
You must be signed in to change notification settings - Fork 0
/
filterparse.y
69 lines (56 loc) · 838 Bytes
/
filterparse.y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
%{
package tagger
%}
%union{
filter Filter
tag string
val int
comp Comparator
}
%token TAG VAL COMP
%token AND OR
%token LPAREN RPAREN
%type <filter> expr paren and_expr or_expr comp tag
%type <val> VAL
%type <tag> TAG
%type <comp> COMP
%%
goal:
expr { yylex.(*lex).filter = $1 }
expr:
paren
| and_expr
| or_expr
| comp
| tag
paren:
LPAREN expr RPAREN { $$ = $2 }
and_expr:
and_expr AND expr
{
$$ = AndFilter{Filters: append($1.(AndFilter).Filters, $3)}
}
| expr AND expr
{
$$ = AndFilter{Filters: []Filter{$1, $3}}
}
or_expr:
or_expr OR expr
{
$$ = OrFilter{Filters: append($1.(OrFilter).Filters, $3)}
}
| expr OR expr
{
$$ = OrFilter{Filters: []Filter{$1, $3}}
}
comp:
TAG COMP VAL
{
$$ = ComparinsonFilter{Name: $1, Value: $3, Function: $2}
}
tag:
TAG
{
$$ = NameFilter{Name: $1}
}
%%