]> mj.ucw.cz Git - umpf.git/commitdiff
fix ass_right bugs, finish print_code
authorAnicka Bernathova <anicka@anicka.net>
Wed, 15 Jul 2009 21:18:55 +0000 (23:18 +0200)
committerAnicka Bernathova <anicka@anicka.net>
Wed, 15 Jul 2009 21:18:55 +0000 (23:18 +0200)
code.c
cond.y

diff --git a/code.c b/code.c
index 070f7831615d86c5bb3f75c7f434a35e1f6997cd..2cee897198dc45388e25f9e5d4df268732bbc7be 100644 (file)
--- a/code.c
+++ b/code.c
@@ -114,6 +114,22 @@ evaluate(struct tree* t, int pref_var, struct list* where)
                                return new_3par_instr(OPC_CAT, left, 
                                        right, pref_var, where);
                                break;
+                       case '+':
+                               return new_3par_instr(OPC_PLUS, left, 
+                                       right, pref_var, where);
+                               break;
+                       case '-':
+                               return new_3par_instr(OPC_MINUS, left, 
+                                       right, pref_var, where);
+                               break;
+                       case '*':
+                               return new_3par_instr(OPC_MUL, left, 
+                                       right, pref_var, where);
+                               break;
+                       case '/':
+                               return new_3par_instr(OPC_DIV, left, 
+                                       right, pref_var, where);
+                               break;
                        default:
                                die("evaluate: got to default");
                }
@@ -367,9 +383,51 @@ print_code(void)
                        case OPC_GT:
                                printf("GT %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
                                break;
+                       case OPC_LT:
+                               printf("LT %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_LE:
+                               printf("LE %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_GE:
+                               printf("GE %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_RE:
+                               printf("RE %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_NRE:
+                               printf("NRE %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_NEQ:
+                               printf("NEQ %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_EQ:
+                               printf("EQ %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
                        case OPC_AND:
                                printf("AND %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
                                break;
+                       case OPC_OR:
+                               printf("OR %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_XOR:
+                               printf("XOR %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_PLUS:
+                               printf("PLUS %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_MINUS:
+                               printf("MINUS %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_MUL:
+                               printf("MUL %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_DIV:
+                               printf("DIV %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+                               break;
+                       case OPC_NOT:
+                               printf("NOT %d %d\n", p->u.dpop.par, p->u.dpop.res);
+                               break;
                        case OPC_NOP:
                                puts("NOP");    
                                break;
diff --git a/cond.y b/cond.y
index ec5bc8e34a53b32580e55c56f46b705ef66d3360..5410156de9db8915290caf5550d866641268f55f 100644 (file)
--- a/cond.y
+++ b/cond.y
@@ -16,6 +16,7 @@ static struct tree* tree_malloc(int type);
        struct tree* tr;        
 }
 
+%right <n> '!'
 %token <str> CONST
 %token <n> NUM
 %token <str> VAR
@@ -26,24 +27,23 @@ static struct tree* tree_malloc(int type);
 %nonassoc KW_ELSE
 %left ARROW
 %left <n> EQ NEQ GE LE '<' '>' RE NRE
-%left '='
+%left <n> '='
 %left <n> '.'
 %left <n> '+' '-' 
 %left <n> '*' '/'
 %left <n> '|'
 %left <n> '^'
 %left <n> '&'
-%left <n> '!'
 %type <tr> input 
 %type <tr> command 
 %type <tr> next 
 %type <tr> ass 
 %type <tr> ass_right 
+%type <tr> ass_right_p
 %type <tr> cif
 %type <tr> arrow 
 %type <tr> cond
 %type <n> rop 
-%type <n> bop 
 %type <n> left
 %type <n> right 
 %type <tr> leaves 
@@ -147,7 +147,7 @@ rop:        '>'
 ;
 
 ass:
-       VAR '=' ass_right       {
+       VAR '=' ass_right_p     {
                                        $$ = tree_malloc(ST_ASS);
 
                                        $$->pt.ass.left = tree_malloc(ST_LEAF);
@@ -196,20 +196,41 @@ right:    /* empty */ { $$ = K_EMPTY; }
        | KW_MAIL { $$ = K_MAIL; }
 ;
 
+ass_right_p:   '(' ass_right ')'       {$$ = $2; }
+               | ass_right     {$$ = $1; }
+;
+
 ass_right:     leaves
-               | ass_right bop ass_right       {
+               | ass_right '.' ass_right       {
+                                       $$ = tree_malloc(ST_OP);
+                                       $$->pt.op.op = $2;
+                                       $$->pt.op.left = $1;    
+                                       $$->pt.op.right = $3;   
+                               }
+               | ass_right '+' ass_right       {
+                                       $$ = tree_malloc(ST_OP);
+                                       $$->pt.op.op = $2;
+                                       $$->pt.op.left = $1;    
+                                       $$->pt.op.right = $3;   
+                               }
+               | ass_right '-' ass_right       {
+                                       $$ = tree_malloc(ST_OP);
+                                       $$->pt.op.op = $2;
+                                       $$->pt.op.left = $1;    
+                                       $$->pt.op.right = $3;   
+                               }
+               | ass_right '*' ass_right       {
+                                       $$ = tree_malloc(ST_OP);
+                                       $$->pt.op.op = $2;
+                                       $$->pt.op.left = $1;    
+                                       $$->pt.op.right = $3;   
+                               }
+               | ass_right '/' ass_right       {
                                        $$ = tree_malloc(ST_OP);
                                        $$->pt.op.op = $2;
                                        $$->pt.op.left = $1;    
                                        $$->pt.op.right = $3;   
                                }
-;
-
-bop:   '.'   {$$ = $1} 
-       | '+' {$$ = $1}
-       | '-' {$$ = $1}
-       | '*' {$$ = $1}
-       | '/' {$$ = $1}
 ;
 
 %%