mirror_iproute2/tc/emp_ematch.y
Ethan Sommer 5f78bc3e1d make yacc usage POSIX compatible
config: put YACC in config.mk and use environmental variable if present

ss:
use YACC variable instead of hardcoding bison
place options before source file argument
use -b to specify file prefix instead of output file, as -o isn't POSIX
compatible, this generates ssfilter.tab.c instead of ssfilter.c
replace any references to ssfilter.c with references to ssfilter.tab.c

tc:
use -p flag to set name prefix instead of bison-specific api.prefix
directive
remove unneeded bison-specific directives
use -b instead of -o, replace references to previously generated
emp_ematch.yacc.[ch] with references to newly generated
emp_ematch.tab.[ch]

Signed-off-by: Ethan Sommer <e5ten.arch@gmail.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
2020-01-20 09:43:22 -08:00

96 lines
1.2 KiB
Plaintext

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