fix bracket evaluation master v1.3
authorLaurent Mazet <laurent.mazet@thalesgroup.com>
Mon, 8 Apr 2024 09:20:59 +0000 (11:20 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Mon, 8 Apr 2024 09:21:50 +0000 (11:21 +0200)
calc.c
element.h
parser.c

diff --git a/calc.c b/calc.c
index 4f23857c3ad5e60edc15595c589e4dc0cbe66d74..b6b62946275d4594d19a76e0e9df4b3d1dff834c 100644 (file)
--- a/calc.c
+++ b/calc.c
@@ -281,6 +281,8 @@ int main (int argc, char *argv[])
 // test: echo "1 + cos (2 - 3)" | calc.exe | grep -q '=> 1\.5403'
 // test: echo "cos (1 / 2) * 3" | calc.exe | grep -q '=> 2\.63275'
 // test: echo "1 + 4 * (2 - 3)" | calc.exe | grep -q '=> -3'
+// test: echo "10 - (5 + 5)" | calc.exe | grep -q '=> 0'
+// test: echo "10 + (5 + 5) * 2" | calc.exe | grep -q '=> 30'
 // test: echo "(2 - 3) / 4" | calc.exe | grep -q '=> -0\.25'
 // test: echo "pow (8 - 3, 4 / 3)" | calc.exe | grep -q '=> 8\.54988'
 // test: echo "1 + -2" | calc.exe | grep -q '=> -1'
@@ -308,6 +310,7 @@ int main (int argc, char *argv[])
 // test: echo "2 + cos (pi +" | calc.exe | grep -q 'error'
 // test: echo "2 + cos (pi" | calc.exe | grep -q 'error'
 // test: echo "(2 + " | calc.exe | grep -q 'error'
+// test: echo "1 (2 + 3)" | calc.exe | grep -q 'error'
 // test: echo "cos (1, 2)" | calc.exe | grep -q 'error'
 // test: echo "sqrt 2" | calc.exe | grep -q 'error'
 // test: echo "pow (2)" | calc.exe | grep -q 'error'
index 03b8128d72fbe943fe87a0d00ac55bee5780d573..fff313c4bcdd00c1392f05d1b4a86a767c87681e 100644 (file)
--- a/element.h
+++ b/element.h
@@ -4,7 +4,7 @@
 /* function type */
 
 typedef enum {
-    Val = 0, Sig,
+    Val = 0, Id, Sig,
     Add, Sub,
     Mul, Div, Mod,
     Pow, Sqr,
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;