From ec3c436489066253b415d5d308808c2c1beed144 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Mon, 8 Apr 2024 11:20:59 +0200 Subject: [PATCH] fix bracket evaluation --- calc.c | 3 +++ element.h | 2 +- parser.c | 9 ++++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/calc.c b/calc.c index 4f23857..b6b6294 100644 --- 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' diff --git a/element.h b/element.h index 03b8128..fff313c 100644 --- 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, diff --git a/parser.c b/parser.c index 7880acf..a98eab0 100644 --- 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; -- 2.30.2