Blame tc/emp_ematch.y

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