public static int literal() {
		// Literals are literals or we just saw a backslash so it can be any char
		if(ignore || isLiteral()) {
			// Make a state for it
			setState(state, expression.charAt(j), state + 1, state + 1);
			state++;
			// Consume it
			j++;
			// Reset the ignore flag
			ignore = false;
			return state - 1;
		}
		// If it's an expression in brackets
		else if (expression.charAt(j) == '('){
			// Consume the bracket
			j++;
			// Go looking for an expression
			int r = expression();
			// If we're looking at a close bracket then consume it
			if (expression.charAt(j) == ')'){
				j++;
				return r;
			}
			// Else it's not legal
			else error();
		}
		// If we're looking at a square bracket then we're expecting a set of literals
		else if(expression.charAt(j) == '['){
			//consume the open square bracket
			j++;
			// Go looking for a set of literals
			int r = literalSet();
			// If we're looking at a close bracket then consume it
			if (expression.charAt(j) == ']'){
				j++;
				// Set the references for the end state of the literal set
				for(int i = 0; i < fsm.ch.length; i++){
					if(fsm.next1[i] == -3){
						fsm.next1[i] = fsm.next2[i] = state;
					}
				}
				return r;
			}
			// Otherwise throw an error
			else error();
		}
		return error();
	}