forked from akrennmair/newsbeuter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilter.atg
74 lines (59 loc) · 1.76 KB
/
filter.atg
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
69
70
71
72
73
74
/*
* parser for newsbeuter filter language
*/
#include "FilterParser.h"
COMPILER Filter
FilterParser * gen;
CHARACTERS
identchar = 'A'..'Z' + 'a'..'z' + "_-.".
digit = "0123456789".
nonquote = ANY - '"'.
TOKENS
openblock = '('.
closeblock = ')'.
ident = identchar { identchar }.
stringliteral = '"' { nonquote } '"'.
numliteral = ['-'] digit { digit }.
rangeliteral = digit { digit } ':' digit { digit }.
PRODUCTIONS
stringlit<char* &lit>
= ( stringliteral | numliteral | rangeliteral ) (. lit = coco_string_create_char(t->val); .)
.
matchattrib<char* &name>
= ident (. name = coco_string_create_char(t->val); .)
.
matchop<int &op>
= "==" (. op = MATCHOP_EQ; .)
| "=" (. op = MATCHOP_EQ; .)
| "!=" (. op = MATCHOP_NE; .)
| "=~" (. op = MATCHOP_RXEQ; .)
| "!~" (. op = MATCHOP_RXNE; .)
| "<" (. op = MATCHOP_LT; .)
| ">" (. op = MATCHOP_GT; .)
| "<=" (. op = MATCHOP_LE; .)
| ">=" (. op = MATCHOP_GE; .)
| "#" (. op = MATCHOP_CONTAINS; .)
| "!#" (. op = MATCHOP_CONTAINSNOT; .)
| "between" (. op = MATCHOP_BETWEEN; .)
.
logop<int &lop>
= "and" (. lop = LOGOP_AND; .)
| "or" (. lop = LOGOP_OR; .)
.
matchexpr (. char * name, * lit; int op; .)
= matchattrib<name>
matchop<op>
stringlit<lit> (. gen->add_matchexpr(name, op, lit); .)
.
blockexpr
= openblock (. gen->open_block(); .)
expr
closeblock (. gen->close_block(); .)
.
expr (. int lop; .)
= ( matchexpr | blockexpr )
{ logop<lop> (. gen->add_logop(lop); .)
( matchexpr | blockexpr ) }
.
Filter = expr.
END Filter.