protected ProdElement parseUnordered(Stack<Pair<Token, String>> tokens) { ProdElement first = parseSeq(tokens); if (!tokens.isEmpty() && tokens.peek().getFirst() == Token.AND) { ProdElement uno = createElement(ElementType.UNOREDERED); uno.addChild(first); do { tokens.pop(); ProdElement next = parseSeq(tokens); uno.addChild(next); } while (!tokens.isEmpty() && tokens.peek().getFirst() == Token.AND); return uno; } return first; }
public BacktrackItem handle(ProdElement state, BacktrackItem previous) { if (Strings.isEmpty(state.getValue())) return previous; if (Strings.isEmpty(state.getName())) { if (text.regionMatches(previous.offset, state.getValue(), 0, state.getValue().length())) { int newOffset = previous.offset + state.getValue().length(); Matcher ws = WS.matcher(text).region(newOffset, text.length()); int childOffset = ws.find() ? ws.end() : newOffset; return new BacktrackItem(childOffset, state, state.getValue()); } } else { Token t = Token.valueOf(state.getValue()); Matcher matcher = t.pattern.matcher(text).region(previous.offset, text.length()); if (matcher.find()) { Matcher ws = WS.matcher(text).region(matcher.end(), text.length()); int childOffset = ws.find() ? ws.end() : matcher.end(); String value = matcher.groupCount() > 0 && matcher.group(1) != null ? matcher.group(1) : matcher.group(0); return new BacktrackItem(childOffset, state, value); } } return null; }
if (trace != null && !trace.isEmpty()) { for (BacktrackItem item : trace) if (item.token != null && item.token.getName() != null) { String key = item.token.getName(); params.removeAll(key); params.putAll(key, convertValue(res, node, semanticOffset, Token.valueOf(item.token.getValue()), item.value));
case STRING: ProdElement result2 = createElement(ElementType.TOKEN); result2.setValue(current.getSecond()); parseCardinality(tokens, result2); return result2; case ID: ProdElement result3 = createElement(ElementType.TOKEN); result3.setName(current.getSecond()); Pair<Token, String> eq = tokens.pop(); if (eq.getFirst() == Token.EQ) { case ID: case STRING: result3.setValue(val.getSecond()); break; default:
protected ProdElement parseAlt(Stack<Pair<Token, String>> tokens) { ProdElement first = parseUnordered(tokens); if (!tokens.isEmpty() && tokens.peek().getFirst() == Token.PIPE) { ProdElement uno = createElement(ElementType.ALTERNATIVE); uno.addChild(first); do { tokens.pop(); ProdElement next = parseUnordered(tokens); uno.addChild(next); } while (!tokens.isEmpty() && tokens.peek().getFirst() == Token.PIPE); return uno; } return first; }
protected ProdElement createElement(ElementType type) { return new ProdElement(type); }
protected ProdElement parseAlt(Stack<Pair<Token, String>> tokens) { ProdElement first = parseUnordered(tokens); if (!tokens.isEmpty() && tokens.peek().getFirst() == Token.PIPE) { ProdElement uno = createElement(ElementType.ALTERNATIVE); uno.addChild(first); do { tokens.pop(); ProdElement next = parseUnordered(tokens); uno.addChild(next); } while (!tokens.isEmpty() && tokens.peek().getFirst() == Token.PIPE); return uno; } return first; }
protected ProdElement parseSeq(Stack<Pair<Token, String>> tokens) { ProdElement first = parsePrim(tokens); EnumSet<Token> followers = EnumSet.of(Token.STRING, Token.PL, Token.ID); if (!tokens.isEmpty() && followers.contains(tokens.peek().getFirst())) { ProdElement seq = createElement(ElementType.SEQUENCE); seq.addChild(first); do { ProdElement next = parsePrim(tokens); seq.addChild(next); } while (!tokens.isEmpty() && followers.contains(tokens.peek().getFirst())); return seq; } return first; }
protected ProdElement parseSeq(Stack<Pair<Token, String>> tokens) { ProdElement first = parsePrim(tokens); EnumSet<Token> followers = EnumSet.of(Token.STRING, Token.PL, Token.ID); if (!tokens.isEmpty() && followers.contains(tokens.peek().getFirst())) { ProdElement seq = createElement(ElementType.SEQUENCE); seq.addChild(first); do { ProdElement next = parsePrim(tokens); seq.addChild(next); } while (!tokens.isEmpty() && followers.contains(tokens.peek().getFirst())); return seq; } return first; }
protected ProdElement createElement(ElementType type) { return new ProdElement(type); }
protected ProdElement parseUnordered(Stack<Pair<Token, String>> tokens) { ProdElement first = parseSeq(tokens); if (!tokens.isEmpty() && tokens.peek().getFirst() == Token.AND) { ProdElement uno = createElement(ElementType.UNOREDERED); uno.addChild(first); do { tokens.pop(); ProdElement next = parseSeq(tokens); uno.addChild(next); } while (!tokens.isEmpty() && tokens.peek().getFirst() == Token.AND); return uno; } return first; }
protected Nfa<ProdElement> getParameterNfa(String syntax) { AssignedProduction prod = new AssignedProduction(syntax); FollowerFunctionImpl<ProdElement, String> ff = new FollowerFunctionImpl<ProdElement, String>(prod); ProdElement start = prod.new ProdElement(ElementType.TOKEN); ProdElement stop = prod.new ProdElement(ElementType.TOKEN); Nfa<ProdElement> result = new NfaUtil().create(prod, ff, start, stop); return result; }