private Node parseRange() {
		if (input.charAt(offset) == '^') {
			throwError("Negotiated ranges are forbidden");
		}
		
		Decision result = new Decision(this);
		while (offset < input.length()) {
			char from = input.charAt(offset);
			if (from == ']') {
				offset++;
				break;
			}
			
			char sep = input.charAt(offset + 1);
			
			if (sep == '-' && from != '\\') {
				char to = input.charAt(offset + 2);
				if (to != ']') {
					offset += 3;
					result.append(new Range(this, from, to));
				}
				else {
					result.append(parseLiteral(false));
				}
			}
			else {
				result.append(parseLiteral(false));
			}
		}
		parseQuantifier(result);
		return result;
	}