fix bracket evaluation
[calc.git] / parser.c
index 7880acfa156c049e13c778cc5c280faec0f3c412..a98eab0dd27248e0117301c73e50629b37fcfb91 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -144,6 +144,10 @@ element_t *parser (char *str, char **next, int prio)
         if (*str == '(') {
             VERBOSE (DEBUG, fprintf (stdout, "start processing bracket\n"));
             if (root) {
+                if (root->func == Val) {
+                    delelement (root);
+                    return ERROR_OP;
+                }
                 do {
                     found = 0;
                     new = parser (str + 1, &str, 0);
@@ -169,7 +173,7 @@ element_t *parser (char *str, char **next, int prio)
                     }
                 } while (*str == ',');
             } else {
-                root = newelement (Val, 1, 5);
+                root = newelement (Id, 1, 5);
                 new = parser (str + 1, &str, 0);
                 if ((new == NULL) || ((new != ERROR_OP) && (new->prio == 9))) {
                     delelement (new);
@@ -369,6 +373,7 @@ void print_element (element_t *root, int level)
 
     switch (root->func) {
     case Val: func = "Value"; break;
+    case Id: func = "Ident"; break;
     case Sig: func = "Sign"; break;
     case Add: func = "Addition"; break;
     case Sub: func = "Subtraction"; break;
@@ -639,6 +644,7 @@ double evaluate_element (element_t *root, char mask)
             return 0;
         }
         /* fallthrough */
+    case Id:
     case Sqr:
     case Cos:
     case Sin:
@@ -745,6 +751,7 @@ double evaluate_element (element_t *root, char mask)
 
     switch (root->func) {
     case Val: return op0;
+    case Id: return op0;
     case Sig: return -op0;
     case Add: return ((mask & MASK_SUB) == 0) ? op0 + op1 : op0 - op1;
     case Sub: return ((mask & MASK_SUB) == 0) ? op0 - op1 : op0 + op1;