Blame tc/emp_ematch.y

Packit Service 3880ab
%{
Packit Service 3880ab
 #include <stdio.h>
Packit Service 3880ab
 #include <stdlib.h>
Packit Service 3880ab
 #include <malloc.h>
Packit Service 3880ab
 #include <string.h>
Packit Service 3880ab
 #include "m_ematch.h"
Packit Service 3880ab
%}
Packit Service 3880ab
Packit Service 3880ab
%union {
Packit Service 3880ab
	unsigned int i;
Packit Service 3880ab
	struct bstr *b;
Packit Service 3880ab
	struct ematch *e;
Packit Service 3880ab
}
Packit Service 3880ab
Packit Service 3880ab
%{
Packit Service 3880ab
 extern int ematch_lex(void);
Packit Service 3880ab
 extern void yyerror(const char *s);
Packit Service 3880ab
 extern struct ematch *ematch_root;
Packit Service 3880ab
 extern char *ematch_err;
Packit Service 3880ab
%}
Packit Service 3880ab
Packit Service 3880ab
%token  ERROR
Packit Service 3880ab
%token  ATTRIBUTE
Packit Service 3880ab
%token  AND OR NOT
Packit Service 3880ab
%type  invert relation
Packit Service 3880ab
%type <e> match expr
Packit Service 3880ab
%type  args
Packit Service 3880ab
%right AND OR
Packit Service 3880ab
%start input
Packit Service 3880ab
%%
Packit Service 3880ab
input:
Packit Service 3880ab
	/* empty */
Packit Service 3880ab
	| expr
Packit Service 3880ab
		{ ematch_root = $1; }
Packit Service 3880ab
	| expr error
Packit Service 3880ab
		{
Packit Service 3880ab
			ematch_root = $1;
Packit Service 3880ab
			YYACCEPT;
Packit Service 3880ab
		}
Packit Service 3880ab
	;
Packit Service 3880ab
Packit Service 3880ab
expr:
Packit Service 3880ab
	match
Packit Service 3880ab
		{ $$ = $1; }
Packit Service 3880ab
	| match relation expr
Packit Service 3880ab
		{
Packit Service 3880ab
			$1->relation = $2;
Packit Service 3880ab
			$1->next = $3;
Packit Service 3880ab
			$$ = $1;
Packit Service 3880ab
		}
Packit Service 3880ab
	;
Packit Service 3880ab
Packit Service 3880ab
match:
Packit Service 3880ab
	invert ATTRIBUTE '(' args ')'
Packit Service 3880ab
		{
Packit Service 3880ab
			$2->next = $4;
Packit Service 3880ab
			$$ = new_ematch($2, $1);
Packit Service 3880ab
			if ($$ == NULL)
Packit Service 3880ab
				YYABORT;
Packit Service 3880ab
		}
Packit Service 3880ab
	| invert '(' expr ')'
Packit Service 3880ab
		{
Packit Service 3880ab
			$$ = new_ematch(NULL, $1);
Packit Service 3880ab
			if ($$ == NULL)
Packit Service 3880ab
				YYABORT;
Packit Service 3880ab
			$$->child = $3;
Packit Service 3880ab
		}
Packit Service 3880ab
	;
Packit Service 3880ab
Packit Service 3880ab
args:
Packit Service 3880ab
	ATTRIBUTE
Packit Service 3880ab
		{ $$ = $1; }
Packit Service 3880ab
	| ATTRIBUTE args
Packit Service 3880ab
		{ $1->next = $2; }
Packit Service 3880ab
	;
Packit Service 3880ab
Packit Service 3880ab
relation:
Packit Service 3880ab
	AND
Packit Service 3880ab
		{ $$ = TCF_EM_REL_AND; }
Packit Service 3880ab
	| OR
Packit Service 3880ab
		{ $$ = TCF_EM_REL_OR; }
Packit Service 3880ab
	;
Packit Service 3880ab
Packit Service 3880ab
invert:
Packit Service 3880ab
	/* empty */
Packit Service 3880ab
		{ $$ = 0; }
Packit Service 3880ab
	| NOT
Packit Service 3880ab
		{ $$ = 1; }
Packit Service 3880ab
	;
Packit Service 3880ab
%%
Packit Service 3880ab
Packit Service 3880ab
 void yyerror(const char *s)
Packit Service 3880ab
 {
Packit Service 3880ab
	 ematch_err = strdup(s);
Packit Service 3880ab
 }