forgot this
This commit is contained in:
parent
3f6a501b4d
commit
e72e360a1a
1 changed files with 107 additions and 0 deletions
107
src/cmd/ip/snoopy/filter.y
Executable file
107
src/cmd/ip/snoopy/filter.y
Executable file
|
|
@ -0,0 +1,107 @@
|
|||
%{
|
||||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <ctype.h>
|
||||
#include "dat.h"
|
||||
|
||||
char *yylp; /* next character to be lex'd */
|
||||
char *yybuffer;
|
||||
char *yyend; /* end of buffer to be parsed */
|
||||
%}
|
||||
|
||||
%term LOR
|
||||
%term LAND
|
||||
%term WORD
|
||||
%right '!'
|
||||
%left '|'
|
||||
%left '&'
|
||||
%left LOR
|
||||
%left LAND
|
||||
%start filter
|
||||
%%
|
||||
|
||||
filter : expr
|
||||
{ filter = $$; }
|
||||
;
|
||||
expr : WORD
|
||||
{ $$ = $1; }
|
||||
| WORD '=' WORD
|
||||
{ $2->l = $1; $2->r = $3; $$ = $2; }
|
||||
| WORD '(' expr ')'
|
||||
{ $1->l = $3; free($2); free($4); $$ = $1; }
|
||||
| '(' expr ')'
|
||||
{ free($1); free($3); $$ = $2; }
|
||||
| expr LOR expr
|
||||
{ $2->l = $1; $2->r = $3; $$ = $2; }
|
||||
| expr LAND expr
|
||||
{ $2->l = $1; $2->r = $3; $$ = $2; }
|
||||
| '!' expr
|
||||
{ $1->l = $2; $$ = $1; }
|
||||
;
|
||||
%%
|
||||
|
||||
/*
|
||||
* Initialize the parsing. Done once for each header field.
|
||||
*/
|
||||
void
|
||||
yyinit(char *p)
|
||||
{
|
||||
yylp = p;
|
||||
}
|
||||
|
||||
int
|
||||
yylex(void)
|
||||
{
|
||||
char *p;
|
||||
int c;
|
||||
|
||||
if(yylp == nil || *yylp == 0)
|
||||
return 0;
|
||||
while(isspace(*yylp))
|
||||
yylp++;
|
||||
|
||||
yylval = newfilter();
|
||||
|
||||
p = strpbrk(yylp, "!|&()= ");
|
||||
if(p == 0){
|
||||
yylval->op = WORD;
|
||||
yylval->s = strdup(yylp);
|
||||
if(yylval->s == nil)
|
||||
sysfatal("parsing filter: %r");
|
||||
yylp = nil;
|
||||
return WORD;
|
||||
}
|
||||
c = *p;
|
||||
if(p != yylp){
|
||||
yylval->op = WORD;
|
||||
*p = 0;
|
||||
yylval->s = strdup(yylp);
|
||||
if(yylval->s == nil)
|
||||
sysfatal("parsing filter: %r");
|
||||
*p = c;
|
||||
yylp = p;
|
||||
return WORD;
|
||||
}
|
||||
|
||||
yylp++;
|
||||
if(*yylp == c)
|
||||
switch(c){
|
||||
case '&':
|
||||
c = LAND;
|
||||
yylp++;
|
||||
break;
|
||||
case '|':
|
||||
c = LOR;
|
||||
yylp++;
|
||||
break;
|
||||
}
|
||||
yylval->op = c;
|
||||
return c;
|
||||
}
|
||||
|
||||
void
|
||||
yyerror(char *e)
|
||||
{
|
||||
USED(e);
|
||||
sysfatal("error parsing filter");
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue