private Object parseRecursive(StringTokenizer st) { List<Object> currentSequence = new ArrayList<>(); Object lastParsed = null; while (st.hasMoreElements()) { String s = st.nextToken(); switch (s) { case " ": // split on blanks currentSequence.add(lastParsed); break; case "?": lastParsed = grammar.zeroOrOne(lastParsed); break; case "*": lastParsed = grammar.zeroOrMore(lastParsed); break; case "(": lastParsed = parseRecursive(st); break; case ")": // current group finished return finish(currentSequence, lastParsed); case "'": lastParsed = Token.getFromDescription(st.nextToken("'")); st.nextToken("'?*() "); // ' break; default: lastParsed = s; // rule name break; } } return finish(currentSequence, lastParsed); }