code: function SemanticChecker(tokens) {
      this._tokens = tokens;
      this._index = -1;
      this._tree = null;
      this._stack = [];
      if (!this.checkExp()) {
          throw [0, "This is not a understandable expression!"];
      }
      if (this.tkn() !== null) {
          throw [this._index, "Unexpected end of expression! Maybe you forgot a \"(\" somewhere."];
      }
  }
docs: Exp := ExpBody, ExpTail*
  ExpBody := Block | NUMBER | STRING | ID | Neg | Not
  Block := "(", Exp, ")"
  Neg := SUB, Exp
  Not := NOT, Exp
  ExpTail := OPE, Exp