CF_KEYWORDS(FUNCTION, FILTER, PRINTDEBUG, INT, PRINT)
%type <x> term
+%type <x> cmds
CF_GRAMMAR
-program: /* EMPTY */
- | program function
- ;
-
CF_ADDTO(conf, function)
function:
- FUNCTION SYM '(' ')' '{' term '}' {
+ FUNCTION SYM '(' ')' '{' cmds '}' {
extern struct f_instruction *last_func;
if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
$2->class = SYM_FUNCTION;
- $2->aux = $6;
+ $2->def = $6;
last_func = $6;
printf("Hmm, we've got one function here\n");
}
CF_ADDTO(conf, filter)
filter:
- FILTER SYM '{' term '}' {
+ FILTER SYM '{' cmds '}' {
if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
$2->class = SYM_FILTER;
- $2->aux = $4;
+ $2->def = $4;
printf( "We have new filter defined (%s)\n", $2->name )
}
;
/* Programs */
-term: /* EMPTY */ { $$ = NULL; }
- | term ';' term {
- $$ = cfg_alloc(sizeof(struct f_instruction));
- printf( "We've got statement here\n" );
- $$->code = ',';
- $$->arg1 = $1;
- $$->arg2 = $3;
+cmds:
+ term {
+ if ($1) {
+ $1->next = NULL;
+ $$ = $1;
+ } else $$ = NULL;
+ }
+ | term ';' cmds {
+ if ($1) {
+ $1->next = $3;
+ $$ = $1;
+ } else $$ = $3;
+ }
+ ;
+
+term:
+ /* EMPTY */ {
+ $$ = NULL;
}
| INT SYM {
if ($2->class != SYM_VOID) cf_error("Symbol already defined, can not use as variable\n" );
$$ = NULL;
}
| SYM '=' expr {
- $$ = cfg_alloc(sizeof(struct f_instruction));
+ $$ = f_new_inst();
printf( "Ook, we'll set value\n" );
if ($1->class != SYM_VARIABLE_INT)
cf_error( "You may only set variables\n" );
$$->arg2 = $3;
}
| PRINT '(' SYM ')' {
- $$ = cfg_alloc(sizeof(struct f_instruction));
+ $$ = f_new_inst();
printf( "Ook, we'll print something\n" );
$$->code = 'p';
$$->arg1 = $3;
$$->arg2 = NULL;
}
| PRINTDEBUG {
- $$ = cfg_alloc(sizeof(struct f_instruction));
+ $$ = f_new_inst();
$$->code = 'D';
$$->arg1 = $$->arg2 = NULL;
}
{
struct symbol *sym;
if (!what)
- return 0;
+ return;
switch(what->code) {
case ',':
interpret(what->arg1);
break;
case '=':
sym = what->arg1;
- sym->aux = what->arg2;
+ sym->aux = (int) what->arg2;
break;
case 'p':
sym = what->arg1;
case 'D':
printf( "DEBUGGING PRINT\n" );
break;
+ case '0':
+ printf( "No operation\n" );
+ break;
}
+ interpret(what->next);
}
void
}
}
+struct f_instruction *
+f_new_inst(void)
+{
+ struct f_instruction * ret;
+ ret = cfg_alloc(sizeof(struct f_instruction));
+ ret->code = 0;
+ ret->arg1 = ret->arg2 = ret->next = NULL;
+ return ret;
+}
+
+int
+f_run(struct symbol *filter, struct rte *rtein, struct rte **rteout)
+{
+ struct f_instruction *inst;
+ debug( "Running filter `%s'...", filter->name );
+
+ inst = filter->def;
+ interpret(inst);
+ debug( "done\n" );
+ return F_ACCEPT;
+}