private Node parseInclude() throws ParserError {
		if (!EAT(TokenType.OPEN)) {
			return null;
		}

		if (!EAT(TokenType.INCLUDE)) {
			throw new ParserError("No 'INCLUDE'", this);
		}

		Node path = parseString();

		ArrayList<Node> args = new ArrayList<>();
		args.add(path);

		if (EAT(TokenType.WITH)) {
			while (CURRENT_TYPE() != TokenType.CLOSE) {
				Node ident = parseIdent();
				if (ident == null) {
					throw new ParserError("Missing ident after WITH", this);
				}
				args.add(ident);

				if (!EAT(TokenType.ASSIGN)) {
					throw new ParserError("Missing '=' after WITH", this);
				}

				Node expr = parseExpr();
				if (expr == null) {
					throw new ParserError("Missing expr after WITH: "
							+ CURRENT_TYPE(), this);
				}
				args.add(expr);

				if (EAT(TokenType.COMMA)) {
					continue;
				} else {
					break;
				}
			}
		}

		if (!EAT(TokenType.CLOSE)) {
			throw new ParserError("Missing closing tag after 'INCLUDE'", this);
		}

		return new Node(NodeType.INCLUDE, args, PREV_LINE_NUMBER());
	}