• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 %{
2  #include <stdio.h>
3  #include <stdlib.h>
4  #include <malloc.h>
5  #include <string.h>
6  #include "m_ematch.h"
7 %}
8 
9 %locations
10 %token-table
11 %error-verbose
12 %name-prefix "ematch_"
13 
14 %union {
15 	unsigned int i;
16 	struct bstr *b;
17 	struct ematch *e;
18 }
19 
20 %{
21  extern int ematch_lex(void);
22  extern void yyerror(const char *s);
23  extern struct ematch *ematch_root;
24  extern char *ematch_err;
25 %}
26 
27 %token <i> ERROR
28 %token <b> ATTRIBUTE
29 %token <i> AND OR NOT
30 %type <i> invert relation
31 %type <e> match expr
32 %type <b> args
33 %right AND OR
34 %start input
35 %%
36 input:
37 	/* empty */
38 	| expr
39 		{ ematch_root = $1; }
40 	| expr error
41 		{
42 			ematch_root = $1;
43 			YYACCEPT;
44 		}
45 	;
46 
47 expr:
48 	match
49 		{ $$ = $1; }
50 	| match relation expr
51 		{
52 			$1->relation = $2;
53 			$1->next = $3;
54 			$$ = $1;
55 		}
56 	;
57 
58 match:
59 	invert ATTRIBUTE '(' args ')'
60 		{
61 			$2->next = $4;
62 			$$ = new_ematch($2, $1);
63 			if ($$ == NULL)
64 				YYABORT;
65 		}
66 	| invert '(' expr ')'
67 		{
68 			$$ = new_ematch(NULL, $1);
69 			if ($$ == NULL)
70 				YYABORT;
71 			$$->child = $3;
72 		}
73 	;
74 
75 args:
76 	ATTRIBUTE
77 		{ $$ = $1; }
78 	| ATTRIBUTE args
79 		{ $1->next = $2; }
80 	;
81 
82 relation:
83 	AND
84 		{ $$ = TCF_EM_REL_AND; }
85 	| OR
86 		{ $$ = TCF_EM_REL_OR; }
87 	;
88 
89 invert:
90 	/* empty */
91 		{ $$ = 0; }
92 	| NOT
93 		{ $$ = 1; }
94 	;
95 %%
96 
97  void yyerror(const char *s)
98  {
99 	 ematch_err = strdup(s);
100  }
101