Allow other operations than +.
This commit is contained in:
parent
f4ab231746
commit
c5a06f65ee
3 changed files with 23 additions and 2 deletions
|
@ -334,6 +334,9 @@ function_call:
|
||||||
term:
|
term:
|
||||||
'(' term ')' { $$ = $2; }
|
'(' term ')' { $$ = $2; }
|
||||||
| term '+' term { $$ = f_new_inst(); $$->code = '+'; $$->a1.p = $1; $$->a2.p = $3; }
|
| term '+' term { $$ = f_new_inst(); $$->code = '+'; $$->a1.p = $1; $$->a2.p = $3; }
|
||||||
|
| term '-' term { $$ = f_new_inst(); $$->code = '-'; $$->a1.p = $1; $$->a2.p = $3; }
|
||||||
|
| term '*' term { $$ = f_new_inst(); $$->code = '*'; $$->a1.p = $1; $$->a2.p = $3; }
|
||||||
|
| term '/' term { $$ = f_new_inst(); $$->code = '/'; $$->a1.p = $1; $$->a2.p = $3; }
|
||||||
| term '=' term { $$ = f_new_inst(); $$->code = P('=','='); $$->a1.p = $1; $$->a2.p = $3; }
|
| term '=' term { $$ = f_new_inst(); $$->code = P('=','='); $$->a1.p = $1; $$->a2.p = $3; }
|
||||||
| term NEQ term { $$ = f_new_inst(); $$->code = P('!','='); $$->a1.p = $1; $$->a2.p = $3; }
|
| term NEQ term { $$ = f_new_inst(); $$->code = P('!','='); $$->a1.p = $1; $$->a2.p = $3; }
|
||||||
| term '<' term { $$ = f_new_inst(); $$->code = '<'; $$->a1.p = $1; $$->a2.p = $3; }
|
| term '<' term { $$ = f_new_inst(); $$->code = '<'; $$->a1.p = $1; $$->a2.p = $3; }
|
||||||
|
|
|
@ -230,6 +230,22 @@ interpret(struct f_inst *what)
|
||||||
default: runtime( "Usage of unknown type" );
|
default: runtime( "Usage of unknown type" );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case '-':
|
||||||
|
TWOARGS_C;
|
||||||
|
switch (res.type = v1.type) {
|
||||||
|
case T_VOID: runtime( "Can not operate with values of type void" );
|
||||||
|
case T_INT: res.val.i = v1.val.i - v2.val.i; break;
|
||||||
|
default: runtime( "Usage of unknown type" );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '*':
|
||||||
|
TWOARGS_C;
|
||||||
|
switch (res.type = v1.type) {
|
||||||
|
case T_VOID: runtime( "Can not operate with values of type void" );
|
||||||
|
case T_INT: res.val.i = v1.val.i * v2.val.i; break;
|
||||||
|
default: runtime( "Usage of unknown type" );
|
||||||
|
}
|
||||||
|
break;
|
||||||
case '/':
|
case '/':
|
||||||
TWOARGS_C;
|
TWOARGS_C;
|
||||||
switch (res.type = v1.type) {
|
switch (res.type = v1.type) {
|
||||||
|
@ -582,6 +598,8 @@ i_same(struct f_inst *f1, struct f_inst *f2)
|
||||||
switch(f1->code) {
|
switch(f1->code) {
|
||||||
case ',': /* fall through */
|
case ',': /* fall through */
|
||||||
case '+':
|
case '+':
|
||||||
|
case '-':
|
||||||
|
case '*':
|
||||||
case '/':
|
case '/':
|
||||||
case P('!','='):
|
case P('!','='):
|
||||||
case P('=','='):
|
case P('=','='):
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
router id 62.168.0.1;
|
router id 62.168.0.1;
|
||||||
|
|
||||||
define xyzzy = 120+10;
|
#define xyzzy = 120+10;
|
||||||
|
|
||||||
function callme(int arg1; int arg2)
|
function callme(int arg1; int arg2)
|
||||||
int local1;
|
int local1;
|
||||||
|
@ -75,7 +75,7 @@ ip p;
|
||||||
{
|
{
|
||||||
print "Testing filter language:";
|
print "Testing filter language:";
|
||||||
i = four;
|
i = four;
|
||||||
i = 1230 + i;
|
i = 12*100 + 60/2 + i;
|
||||||
i = ( i + 0 );
|
i = ( i + 0 );
|
||||||
print " arithmetics: 1234 = ", i;
|
print " arithmetics: 1234 = ", i;
|
||||||
printn " if statements ";
|
printn " if statements ";
|
||||||
|
|
Loading…
Reference in a new issue