#include #include char *s; double parse(double p[10]) { double result = 0.0, h; char o = '+'; printf("parse: %s\n", s); for (;;) { while (*s == ' ') s++; if (*s == 'p') { int pn = 0; s++; while (isdigit(*s)) { pn = pn*10 + *s - '0'; s++; } h = p[pn - 1]; } else if (*s == '(') { s++; h = parse(p); while(*s == ' ') s++; if (*s == ')') s++; } else if (isdigit(*s) || *s == '-' || *s == '+' || *s == '.') { h = 0.1234; sscanf(s, "%lf", &h); printf("Constante %s = %f\n", s, h); while (isdigit(*s) || *s == '-' || *s == '+' || *s == '.' || *s == 'E') s++; } else if (!strncmp(s, "min", 3)) { double min; s += 4; min = parse(p); for(;;) { while(*s == ' ') s++; if (*s == ',') { double m; s++; m = parse(p); if (m < min) min = m; } else break; } while(*s == ' ') s++; if (*s == ')') s++; h = min; } else if (!strncmp(s, "max", 3)) { double max; s += 4; max = parse(p); for(;;) { while(*s == ' ') s++; if (*s == ',') { double m; s++; m = parse(p); if (m > max) max = m; } else break; } while(*s == ' ') s++; if (*s == ')') s++; h = max; } else if (!strncmp(s, "round", 5)) { s += 6; h = parse(p); while(*s == ' ') s++; if (*s == ')') s++; h = floor(h + 0.5); } else if (!strncmp(s, "if", 2)) { double cond, left, right; int kind; int true; s += 2; cond = parse(p); if (!strncmp(s, "then", 4)) s += 4; left = parse(p); if (!strncmp(s, "else", 4)) s += 4; right = parse(p); if (!strncmp(s, "fi", 2)) s += 2; h = cond != 0 ? left : right; } printf("Term: %f\n", h); switch(o) { case '+' : result += h; break; case '-' : result -= h; break; case '/' : result /= h; break; case '*' : result *= h; break; case 'o' : result = (result != h) ? 1.0 : 0.0; break; case 'g' : result = (result == h) ? 1.0 : 0.0; break; case 's' : result = (result <= h) ? 1.0 : 0.0; break; case 'S' : result = (result < h) ? 1.0 : 0.0; break; case 'b' : result = (result >= h) ? 1.0 : 0.0; break; case 'B' : result = (result > h) ? 1.0 : 0.0; break; case 'A' : result = (result && h) ? 1.0 : 0.0; break; case 'O' : result = (result || h) ? 1.0 : 0.0; break; } printf("result: %f\n", result); while(*s == ' ') s++; if (*s == '+' || *s == '-' || *s == '/' || *s == '*') { o = *s; s++; } else if (!strncmp(s, "<>", 2)) { o = 'o'; s += 2; } else if (!strncmp(s, "<=", 2)) { o = 's'; s += 2; } else if (!strncmp(s, "<", 1)) { o = 'S'; s += 1; } else if (!strncmp(s, ">=", 2)) { o = 'b'; s += 2; } else if (!strncmp(s, ">", 1)) { o = 'B'; s += 1; } else if (!strncmp(s, "=", 1)) { o = 'g'; s += 1; } else if (!strncmp(s, "and", 3)) { o = 'A'; s += 3; } else if (!strncmp(s, "or", 2)) { o = 'O'; s += 2; } else return result; } } void main(int argc, char *argv[]) { double p[10]; int i; s = argv[1]; for(i = 2; i < argc; i++) sscanf(argv[i], "%lf", &p[i - 2]); printf("\n(over %s) antwoord: %f\n", s, parse(p)); }