]> mj.ucw.cz Git - umpf.git/blobdiff - cond.y
fix many little bugs, release 0.1
[umpf.git] / cond.y
diff --git a/cond.y b/cond.y
index 38ec08c759112b110183dc1bebfbead8946fad5c..3b5d6239ba2bb78e439539a18041545b15e16f26 100644 (file)
--- a/cond.y
+++ b/cond.y
@@ -2,10 +2,12 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <ctype.h>
 
 #include "umpf.h"
 
 static struct tree* tree_malloc(int type);
+static enum var_type get_var_type(char* var);
 
 %}
 %error-verbose
@@ -16,7 +18,6 @@ static struct tree* tree_malloc(int type);
        struct tree* tr;        
 }
 
-%right <n> '!'
 %token <str> CONST
 %token <n> NUM
 %token <str> VAR
@@ -34,9 +35,11 @@ static struct tree* tree_malloc(int type);
 %left <n> '|'
 %left <n> '^'
 %left <n> '&'
+%right <n> '!'
+%left <n> NEG
+%type <tr> input_init 
 %type <tr> input 
 %type <tr> command 
-%type <tr> next 
 %type <tr> ass 
 %type <tr> ass_right 
 %type <tr> ass_right_p
@@ -49,17 +52,18 @@ static struct tree* tree_malloc(int type);
 %type <tr> leaves 
 
 %%
-input: /* empty */     { $$ = input_tree = tree_malloc(ST_EMPTY); }
+input_init: input {input_tree = $$}
+
+;
+input: /* empty */     { $$ =  tree_malloc(ST_EMPTY); }
        | command input {       $$ = tree_malloc(ST_BLOCK); 
                                $$->pt.block.head = $1;
                                $$->pt.block.tail = $2;
-
-                               input_tree = $$;
                        } 
 ;
 
 command:        ';' { $$ = tree_malloc(ST_EMPTY); }
-               | '{' command next '}'  {
+               | '{' command input '}'         {
                                                $$ = tree_malloc(ST_BLOCK); 
                                                $$->pt.block.head = $2;
                                                $$->pt.block.tail = $3; 
@@ -70,12 +74,6 @@ command:      ';' { $$ = tree_malloc(ST_EMPTY); }
                | arrow ';' { $$ = $1; }
                
        
-;
-
-next:  /* empty */ {$$ = tree_malloc(ST_EMPTY); }
-       | command
-       
-
 ;
 
 cif:   KW_IF cond command KW_ELSE command      { 
@@ -153,7 +151,7 @@ ass:
                                        $$->pt.ass.left = tree_malloc(ST_LEAF);
                                        $$->pt.ass.left->pt.leaf.type = L_VAR;
                                        $$->pt.ass.left->pt.leaf.value = $1;
-                                       $$->pt.ass.left->pt.leaf.n = find_var($1, var_hash);
+                                       $$->pt.ass.left->pt.leaf.n = find_var($1, get_var_type($1), var_hash);
                                        $$->pt.ass.right = $3;
                                }
 ;
@@ -162,7 +160,7 @@ leaves:             VAR     {
                                $$ = tree_malloc(ST_LEAF);
                                $$->pt.leaf.type = L_VAR;
                                $$->pt.leaf.value = $1;
-                               $$->pt.leaf.n = find_var($1, var_hash);
+                               $$->pt.leaf.n = find_var($1, get_var_type($1), var_hash);
                        }
                | CONST { 
                                $$ = tree_malloc(ST_LEAF);
@@ -232,6 +230,16 @@ ass_right:         leaves
                                        $$->pt.op.left = $1;    
                                        $$->pt.op.right = $3;   
                                }
+               | '-' ass_right %prec NEG {
+                                       $$ = tree_malloc(ST_OP);
+                                       $$->pt.op.op = $1;
+                                       $$->pt.op.left = tree_malloc(ST_LEAF);
+                                       $$->pt.op.left->pt.leaf.type = L_CONST;
+                                       $$->pt.op.left->pt.leaf.value = "0";
+                                       $$->pt.op.left->pt.leaf.n = 
+                                                       store_const("0");
+                                       $$->pt.op.right = $2;   
+                       }
 ;
 
 %%
@@ -246,8 +254,32 @@ tree_malloc(int type)
        return temp;
 }
 
+enum var_type
+get_var_type(char* var)
+{
+       int upper = 0;
+       int lower = 0;
+
+       if (islower(*var))
+               return VAR_USER;
+
+       while (*var) {
+               if (isupper(*var))      
+                       upper++;
+               if (islower(*var))
+                       lower++;
+               var++;
+       }
+       if (upper && lower)
+               return VAR_HEADER;
+
+       return VAR_INTERN;
+}
+
 void
 yyerror (char const *s)
 {
-       fprintf (stderr, "Line %d: %s\n", line, s);
+       fprintf (stderr, "Line %d: %s\n Saving your e-mail to default mailbox %s\n", 
+               line, s, default_mailbox);
+       longjmp(env, 1);
 }