private EnumSet<Fixity> getFixity(ProductionReference inner, ProductionReference outer) { assert outer instanceof TermCons; TermCons tc = (TermCons)outer; int i; for (i = 0; i < tc.items().size(); i++) { if (tc.get(i) == inner) break; } Production p = tc.production(); EnumSet<Fixity> set = EnumSet.noneOf(Fixity.class); int position = getPosition(inner, outer); if (!hasTerminalAtIdx(p, position+1)) { set.add(Fixity.BARE_RIGHT); } if (!hasTerminalAtIdx(p, position-1)) { set.add(Fixity.BARE_LEFT); } return set; }
private void lowerKListAcc(Term term, List<Term> items) { if (term instanceof TermCons) { TermCons cons = (TermCons) term; if (cons.production().klabel().isDefined()) { String labelName = cons.production().klabel().get().name(); if (labelName.equals("#KList")) { assert cons.items().size() == 2; lowerKListAcc(cons.get(0), items); lowerKListAcc(cons.get(1), items); return; } else if (labelName.equals("#EmptyKList")) { return; } } } items.add(term); } }
@Override public Either<Set<ParseFailedException>, Term> apply(TermCons tc) { if (overloads.elements().contains(tc.production()) && tc.items().isEmpty()) { Set<Production> candidates = stream(overloads.elements()).filter(p -> p.klabel().isDefined() && p.klabelAtt().equals(tc.production().klabelAtt()) && overloads.lessThanEq(p, tc.production())).collect(Collectors.toSet()); candidates = overloads.minimal(candidates); if (candidates.size() != 1) { KException ex = new KException(KException.ExceptionType.ERROR, KException.KExceptionGroup.INNER_PARSER, "Overloaded term does not have a least sort. Possible sorts: " + candidates, tc.source().orElse(null), tc.location().orElse(null)); return Left.apply(Sets.newHashSet(new ParseFailedException(ex))); } Production prod = candidates.iterator().next(); prod = Production(prod.klabel(), prod.sort(), prod.items(), prod.att().add("originalPrd", Production.class, tc.production())); return super.apply(TermCons.apply(tc.items(), prod, tc.location(), tc.source())); } return super.apply(tc); } }
public ProductionReference addBrackets(ProductionReference t, ProductionReference previousLeftCapture, ProductionReference previousRightCapture) { if (t instanceof Constant) { return t; } TermCons outer = (TermCons)t; List<Term> newItems = new ArrayList<>(); for (Term t2 : outer.items()) { ProductionReference inner = (ProductionReference) t2; EnumSet<Fixity> fixity = getFixity(outer); int position = getPosition(inner, outer); ProductionReference leftCapture = getLeftCapture(previousLeftCapture, outer, inner); ProductionReference rightCapture = getRightCapture(previousRightCapture, outer, inner); ProductionReference newInner = addBrackets(inner, outer, leftCapture, rightCapture); newInner = addBrackets(newInner, leftCapture, rightCapture); newItems.add(newInner); } return TermCons.apply(ConsPStack.from(newItems), outer.production()); }
java.util.Set<ParseFailedException> warnings = new HashSet<>(); List<Term> reversed = tc.items().stream().collect(Collectors.toList());
prod = ref.production(); if (ref instanceof TermCons) { arity = ((TermCons) ref).items().size();
@Override public Either<java.util.Set<ParseFailedException>, Term> apply(TermCons tc) { assert tc.production() != null : this.getClass() + ":" + " production not found." + tc; if (!tc.production().isSyntacticSubsort() && tc.production().klabel().isDefined() && !exceptions.contains(tc.production().klabel().get().name())) { // match only on the outermost elements if (tc.production().items().apply(0) instanceof NonTerminal) { Either<java.util.Set<ParseFailedException>, Term> rez = new PriorityVisitor2(tc).apply(tc.get(0)); if (rez.isLeft()) return rez; tc = tc.with(0, rez.right().get()); } if (tc.production().items().apply(tc.production().items().size() - 1) instanceof NonTerminal) { int last = tc.items().size() - 1; Either<java.util.Set<ParseFailedException>, Term> rez = new PriorityVisitor2(tc).apply(tc.get(last)); if (rez.isLeft()) return rez; tc = tc.with(last, rez.right().get()); } } return super.apply(tc); }
@Override public Either<java.util.Set<ParseFailedException>, Term> apply(TermCons tc) { assert tc.production() != null : this.getClass() + ":" + " production not found." + tc; if (!tc.production().isSyntacticSubsort() && tc.production().klabel().isDefined() && !exceptions.contains(tc.production().klabel().get().name())) { // match only on the outermost elements if (tc.production().items().apply(0) instanceof NonTerminal) { Either<java.util.Set<ParseFailedException>, Term> rez = new PriorityVisitor2(tc).apply(tc.get(0)); if (rez.isLeft()) return rez; tc = tc.with(0, rez.right().get()); } if (tc.production().items().apply(tc.production().items().size() - 1) instanceof NonTerminal) { int last = tc.items().size() - 1; Either<java.util.Set<ParseFailedException>, Term> rez = new PriorityVisitor2(tc).apply(tc.get(last)); if (rez.isLeft()) return rez; tc = tc.with(last, rez.right().get()); } } return super.apply(tc); }
@Override public Either<java.util.Set<ParseFailedException>, Term> apply(TermCons tc) { assert tc.production() != null : this.getClass() + ":" + " production not found." + tc; if (!tc.production().isSyntacticSubsort() && !tc.production().att().contains("bracket")) { // match only on the outermost elements if (tc.production().items().apply(0) instanceof NonTerminal) { Either<java.util.Set<ParseFailedException>, Term> rez = new PriorityVisitor2(tc, PriorityVisitor2.Side.LEFT, priorities, leftAssoc, rightAssoc).apply(tc.get(0)); if (rez.isLeft()) return rez; tc = tc.with(0, rez.right().get()); } if (tc.production().items().apply(tc.production().items().size() - 1) instanceof NonTerminal) { int last = tc.items().size() - 1; Either<java.util.Set<ParseFailedException>, Term> rez = new PriorityVisitor2(tc, PriorityVisitor2.Side.RIGHT, priorities, leftAssoc, rightAssoc).apply(tc.get(last)); if (rez.isLeft()) return rez; tc = tc.with(last, rez.right().get()); } } return super.apply(tc); }