Выражения состоят из double-констант, операторов +-*/ и скобок.
Ловятся синтаксические ошибки. Результат выдается в double.
38 строк исходного текста - просто, прямолинейно, расширяемо, без использования сторонних библиотек.
in english
Ловятся синтаксические ошибки. Результат выдается в double.
38 строк исходного текста - просто, прямолинейно, расширяемо, без использования сторонних библиотек.
in english
#include <stdio.h>
#include <stdlib.h>
double eval(char*&p);
bool is(char*&p, char c) {
return *p == c ? p++, true : false;
}
double un(char*&p) {
if (is(p, '(')) {
double r = eval(p);
if (!is(p, ')')) printf("expected ')'");
return r;
} else return strtod(p, &p);
}
double muls(char*&p) {
double r = un(p);
for (;;) {
if (is(p, '*')) r *= un(p);
else if (is(p, '/')) r /= un(p);
else return r;
}
}
double eval(char*&p) {
double r = muls(p);
for (;;) {
if (is(p, '+')) r += muls(p);
else if (is(p, '-')) r -= muls(p);
else return r;
}
}
int main(int argc, char** argv) {
double r = eval(argv[1]);
if (*argv[1] == 0) printf("%lf", r);
else printf("error at %s", argv[1]);
return 0;
}
для поддержки функций достаточно добавить еще три строки в double un(char*&p):
ReplyDeletedouble un(char*&p) {
if (is(p, '(')) {
double r = eval(p);
if (!is(p, ')')) printf("expected ')'");
return r;
} else if (strncmp(p, "sin", 3) { // 1
p+=3; //2
return sin(un(p)); //3
} else return strtod(p, &p);
}