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; }