private Node parseElsIf() throws ParserError {
		if (NEXT_TYPE() != TokenType.ELSIF) {
			return null;
		}

		if (!EAT(TokenType.OPEN)) {
			throw new ParserError("Missing open tag before 'ELSIF'", this);
		}
		if (!EAT(TokenType.ELSIF)) {
			throw new ParserError("Should not reach here", this);
		}

		final Node elsifCond = parseExpr();
		if (elsifCond == null) {
			throw new ParserError("No condition after 'ELSIF'", this);
		}
		if (!EAT(TokenType.CLOSE)) {
			throw new ParserError("No closing tag after 'ELSIF'", this);
		}

		Node elsifBody = parseTemplateBody();
		if (elsifBody == null) {
			throw new ParserError("No body after 'ELSIF'", this);
		}
		Arrays.asList(elsifCond, elsifBody);
		Node elseClause = parseElsIf();
		if (elseClause == null) {
			elseClause = parseElse();
		}

		List<Node> list = Arrays.asList(elsifCond, elsifBody, elseClause);
		return new Node(NodeType.IF, list, PREV_LINE_NUMBER());
	}