1 %parse-param {struct list_head *expr_head}
2 %define parse.error verbose
3 
4 %{
5 
6 #include <stdio.h>
7 #include <string.h>
8 #include <linux/compiler.h>
9 #include <linux/list.h>
10 #include "bpf-filter.h"
11 
12 int perf_bpf_filter_lex(void);
13 
14 static void perf_bpf_filter_error(struct list_head *expr __maybe_unused,
15 				  char const *msg)
16 {
17 	printf("perf_bpf_filter: %s\n", msg);
18 }
19 
20 %}
21 
22 %union
23 {
24 	unsigned long num;
25 	struct {
26 		unsigned long type;
27 		int part;
28 	} sample;
29 	enum perf_bpf_filter_op op;
30 	struct perf_bpf_filter_expr *expr;
31 }
32 
33 %token BFT_SAMPLE BFT_OP BFT_ERROR BFT_NUM BFT_LOGICAL_OR
34 %type <expr> filter_term filter_expr
35 %destructor { free ($$); } <expr>
36 %type <sample> BFT_SAMPLE
37 %type <op> BFT_OP
38 %type <num> BFT_NUM
39 
40 %%
41 
42 filter:
43 filter ',' filter_term
44 {
45 	list_add_tail(&$3->list, expr_head);
46 }
47 |
48 filter_term
49 {
50 	list_add_tail(&$1->list, expr_head);
51 }
52 
53 filter_term:
54 filter_term BFT_LOGICAL_OR filter_expr
55 {
56 	struct perf_bpf_filter_expr *expr;
57 
58 	if ($1->op == PBF_OP_GROUP_BEGIN) {
59 		expr = $1;
60 	} else {
61 		expr = perf_bpf_filter_expr__new(0, 0, PBF_OP_GROUP_BEGIN, 1);
62 		list_add_tail(&$1->list, &expr->groups);
63 	}
64 	expr->val++;
65 	list_add_tail(&$3->list, &expr->groups);
66 	$$ = expr;
67 }
68 |
69 filter_expr
70 {
71 	$$ = $1;
72 }
73 
74 filter_expr:
75 BFT_SAMPLE BFT_OP BFT_NUM
76 {
77 	$$ = perf_bpf_filter_expr__new($1.type, $1.part, $2, $3);
78 }
79 
80 %%
81