X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=parser.c;h=02443079228e3385b361b5e2f027152ad48f18ad;hb=f29271085277e2cfe75796b4156c8339a901211d;hp=0caa750c65020c7f490c3da51ed64b7a82e8a0b5;hpb=ef37d966deba005de9def3ef3301634fe918c793;p=calc.git diff --git a/parser.c b/parser.c index 0caa750..0244307 100644 --- a/parser.c +++ b/parser.c @@ -1,4 +1,5 @@ #include +#include #include #include "debug.h" @@ -270,7 +271,6 @@ void print_element (element_t *root, int level) switch (root->func) { case Val: func = "Value"; break; - case Set: func = "Set"; break; case Add: func = "Addition"; break; case Sub: func = "Subtraction"; break; case Mul: func = "Multiplication"; break; @@ -298,4 +298,67 @@ void print_element (element_t *root, int level) } } +/* evaluate element tree */ + +double evaluate_element (element_t *root) +{ + double op0 = 0, op1 = 0; + + if ((root == NULL) || (root == ERROR_OP)) { + VERBOSE (WARNING, PRINTOUT ("error while evaluating\n")); + return 0; + } + + switch (root->func) { + case Val: + if (root->ops[0]) { + return evaluate_element (root->ops[0]); + } else { + return root->value; + } + break; + case Add: + case Sub: + case Mul: + case Div: + case Pow: + if (root->ops[1]) { + op1 = evaluate_element (root->ops[1]); + } else { + VERBOSE (WARNING, PRINTOUT ("error while evaluating (op[1])\n")); + return 0; + } + /* fallthrough */ + case Sqr: + case Cos: + case Sin: + case Atn: + case Log: + case Exp: + if (root->ops[0]) { + op0 = evaluate_element (root->ops[0]); + } else { + VERBOSE (WARNING, PRINTOUT ("error while evaluating (op[0])\n")); + return 0; + } + } + + switch (root->func) { + case Add: return op0 + op1; + case Sub: return op0 - op1; + case Mul: return op0 * op1; + case Div: return op0 / op1; + case Pow: return pow (op0, op1); + case Sqr: return sqrt (op0); + case Cos: return cos (op0); + case Sin: return sin (op0); + case Atn: return atan (op0); + case Log: return log (op0); + case Exp: return exp (op0); + default: break; + } + + return 0; +} + /* vim: set ts=4 sw=4 et: */