Thursday, June 5, 2014

C/C++. Парсер и калькуллятор выражений, заданных текстовой строкой

Выражения состоят из double-констант, операторов +-*/ и скобок.
Ловятся синтаксические ошибки. Результат выдается в 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;
}

1 comment:

  1. для поддержки функций достаточно добавить еще три строки в double un(char*&p):
    double 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);
    }

    ReplyDelete