summaryrefslogtreecommitdiff
path: root/other/parser.cpp
blob: 94b7829b6b6e7240314c81eef3b3d3016b644d9e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
struct Token { // In globalem Vektor, Zugriff über globale Variable.
  int type; // Definiere Konstanten.
  double value;
  Token(int type) : type(type) {}
  Token(int type, int value) : type(type), value(value) {}
};

struct Expression { // Die folgenden Klassen nur für den AST.
  virtual ~Expression() {};
  virtual double getValue() = 0;
};

struct Atom : public Expression {
  double value;
  Atom(int value) : value(value) {};
  double getValue() { return value; }
};

struct BinaryExpression : public Expression {
  Expression *lhs, *rhs;
  BinaryExpression(Expression *lhs, Expression *rhs) : lhs(lhs), rhs(rhs) {}
  ~BinaryExpression() { delete lhs; delete rhs; }
};

struct Addition : public BinaryExpression {
  Addition(Expression *lhs, Expression *rhs) : BinaryExpression(lhs, rhs) {}
  double getValue() { return lhs->getValue() + rhs->getValue(); }
};

Expression* parseF() {
  Expression *lhs;
  switch(tokens[token].type) {
    case NUMBER: return new Atom(tokens[token++].value);
    case LEFT_PAR:
      token++;
      lhs = parseA();
      token++;
      return lhs;
    default:
      return NULL;
}}

Expression* parseA_(Expression *lhs) {
  Expression *plus, *minus;
  if (token >= (int)tokens.size()) return lhs;
  switch(tokens[token].type) {
    case ADDITION:
      token++;
      plus = new Addition(lhs, parseS());
      return parseA_(plus);
    case SUBTRACTION:
      token++;
      minus = new Subtraction(lhs, parseS());
      return parseA_(minus);
    default:
      return lhs;
}}

Expression* parseA() {
  Expression *lhs = parseS(); return parseA_(lhs);
}