private ExpressionNode parseTerm() throws ParseExpressionException {
    ExpressionNode rootNode = null;

    scanner.nextSymbol();
    while (scanner.isNot()) {

      ExpressionNode oldRoot = rootNode;
      rootNode = new ExpressionNotNode(oldRoot);
      scanner.nextSymbol();
    }

    if (scanner.isMiIdentifier()) {
      if (rootNode != null) {
        ExpressionNotNode tmpNode = (ExpressionNotNode) rootNode;
        while (tmpNode.getChild() != null) {
          tmpNode = (ExpressionNotNode) tmpNode.getChild();
        }
        tmpNode.setChild(new ExpressionMiNode(scanner.getCurrSymbol()));
      } else {
        rootNode = new ExpressionMiNode(scanner.getCurrSymbol());
      }
    } else if (scanner.isFreeText()) {
      if (rootNode != null) {
        ExpressionNotNode tmpNode = (ExpressionNotNode) rootNode;
        while (tmpNode.getChild() != null) {
          tmpNode = (ExpressionNotNode) tmpNode.getChild();
        }
        tmpNode.setChild(parseFreeText());

      } else {
        rootNode = parseFreeText();
      }
    } else if (scanner.isLeftPar()) {
      if (rootNode != null) {
        ExpressionNotNode tmpNode = (ExpressionNotNode) rootNode;
        while (tmpNode.getChild() != null) {
          tmpNode = (ExpressionNotNode) tmpNode.getChild();
        }
        tmpNode.setChild(parseExpression());
      } else {
        rootNode = parseExpression();
      }

      scanner.nextSymbol();
      if (!scanner.isRightPar()) {
        throw new ParseExpressionException();
      }
    } else {
      throw new ParseExpressionException();
    }

    return rootNode;
  }