protected Stack<Pair<Token, String>> lex(String string) { int offset = 0; Matcher wsMatcher = WS.matcher(string); List<Pair<Token, Matcher>> matcher = Lists.newArrayList(); for (Token t : Token.values()) matcher.add(Tuples.create(t, t.pattern.matcher(string))); Stack<Pair<Token, String>> result = new Stack<Pair<Token, String>>(); ROOT: while (offset < string.length()) { wsMatcher.region(offset, string.length()); if (wsMatcher.find()) { offset = wsMatcher.end(); continue ROOT; } for (Pair<Token, Matcher> m : matcher) { m.getSecond().region(offset, string.length()); if (m.getSecond().find()) { result.add(Tuples.create(m.getFirst(), m.getSecond().group(m.getSecond().groupCount() == 1 ? 1 : 0))); offset = m.getSecond().end(); continue ROOT; } } throw new RuntimeException("No valid token found at '" + string.substring(offset) + "'"); } Collections.reverse(result); return result; }
case PL: ProdElement result1 = parseAlt(tokens); if (tokens.peek().getFirst().equals(Token.PR)) tokens.pop(); else
protected ProdElement parsePrim(Stack<Pair<Token, String>> tokens) { Pair<Token, String> current = tokens.pop(); switch (current.getFirst()) { case PL: ProdElement result1 = parseAlt(tokens); if (tokens.peek().getFirst().equals(Token.PR)) tokens.pop(); else throw new RuntimeException("')' expected, but " + tokens.peek().getFirst() + " found"); parseCardinality(tokens, result1); return result1; case STRING: ProdElement result2 = createElement(ElementType.TOKEN); result2.value = current.getSecond(); parseCardinality(tokens, result2); return result2; case ID: ProdElement result3 = createElement(ElementType.TOKEN); result3.name = current.getSecond(); parseCardinality(tokens, result3); return result3; default: throw new RuntimeException("Unexpected token " + current.getFirst()); } }
protected ProdElement parsePrim(Stack<Pair<Token, String>> tokens) { Pair<Token, String> current = tokens.pop(); switch (current.getFirst()) { case PL: ProdElement result1 = parseAlt(tokens); if (tokens.peek().getFirst().equals(Token.PR)) tokens.pop(); else throw new RuntimeException("')' expected, but " + tokens.peek().getFirst() + " found"); parseCardinality(tokens, result1); return result1; case STRING: ProdElement result2 = createElement(ElementType.TOKEN); result2.value = current.getSecond(); parseCardinality(tokens, result2); return result2; case ID: ProdElement result3 = createElement(ElementType.TOKEN); result3.name = current.getSecond(); parseCardinality(tokens, result3); return result3; default: throw new RuntimeException("Unexpected token " + current.getFirst()); } }
protected Stack<Pair<Token, String>> lex(String string) { int offset = 0; Matcher wsMatcher = WS.matcher(string); List<Pair<Token, Matcher>> matcher = Lists.newArrayList(); for (Token t : Token.values()) matcher.add(Tuples.create(t, t.pattern.matcher(string))); Stack<Pair<Token, String>> result = new Stack<Pair<Token, String>>(); ROOT: while (offset < string.length()) { wsMatcher.region(offset, string.length()); if (wsMatcher.find()) { offset = wsMatcher.end(); continue ROOT; } for (Pair<Token, Matcher> m : matcher) { m.getSecond().region(offset, string.length()); if (m.getSecond().find()) { result.add(Tuples.create(m.getFirst(), m.getSecond().group(m.getSecond().groupCount() == 1 ? 1 : 0))); offset = m.getSecond().end(); continue ROOT; } } throw new RuntimeException("No valid token found at '" + string.substring(offset) + "'"); } Collections.reverse(result); return result; }