private void applyPattern(Production prod, String varName) { convert(prod.klabel().get(), prod); sb.append("("); String conn = ""; for (int i = 0; i < prod.arity(); i++) { sb.append(conn); sb.append(varName).append(i).append(":"); convert(prod.nonterminal(i).sort(), prod); conn = ", "; } sb.append(')'); }
if (!(prod.sort().equals(prod.nonterminal(0).sort()) && prod.sort().equals(prod.nonterminal(1).sort()))) { throw KEMException.compilerError("Found an associative production with ill formed sorts", prod); if (!(prod.nonterminal(0).sort().equals(prod.nonterminal(1).sort()))) { throw KEMException.compilerError("Found a commutative production with ill formed sorts", prod); Sort childSort = prod.nonterminal(0).sort(); sb.append(" axiom"); convertParams(prod.klabel(), true); if (!(prod.sort().equals(prod.nonterminal(0).sort()) && prod.sort().equals(prod.nonterminal(1).sort()))) { throw KEMException.compilerError("Found an associative production with ill formed sorts", prod); if (!(prod.sort().equals(prod.nonterminal(0).sort()) && prod.sort().equals(prod.nonterminal(1).sort()))) { throw KEMException.compilerError("Found an associative production with ill formed sorts", prod); sb.append(conn); sb.append("\\and{"); convert(prod.nonterminal(i).sort(), prod); sb.append("} (X").append(i).append(":"); convert(prod.nonterminal(i).sort(), prod); sb.append(", Y").append(i).append(":"); convert(prod.nonterminal(i).sort(), prod); sb.append(")"); conn = ", "; convert(sort, false); sb.append("} (X").append(i).append(":"); convert(prod.nonterminal(i).sort(), prod);
private Set<Sort> sort(K k, Rule r) { if (k instanceof KVariable) { return Collections.singleton(k.att().get(Sort.class)); } else if (k instanceof KToken) { return Collections.singleton(((KToken)k).sort()); } else if (k instanceof KApply) { KApply kapp = (KApply)k; if (kapp.klabel() instanceof KVariable) { throw KEMException.compilerError("Cannot compute macros with klabel variables.", r); } Set<Production> prods = new HashSet<>(mutable(mod.productionsFor().apply(kapp.klabel()))); prods.removeIf(p -> p.arity() != kapp.items().size()); for (int i = 0; i < kapp.items().size(); i++) { final int idx = i; Set<Sort> sorts = sort(kapp.items().get(idx), r); prods.removeIf(p -> sorts.stream().noneMatch(s -> mod.subsorts().lessThanEq(s, p.nonterminal(idx).sort()))); } Set<Sort> candidates = prods.stream().map(Production::sort).collect(Collectors.toSet()); return candidates; } else { throw KEMException.compilerError("Cannot compute macros with sort check on terms that are not KApply, KToken, or KVariable.", r); } }
if (kompileOptions.strict()) { items.add(cast(production.nonterminal(j).sort(), KVariable("K" + j))); } else { items.add(KVariable("K" + j)); if (kompileOptions.strict()) { items.set(strictnessPosition, cast(production.nonterminal(strictnessPosition).sort(), KVariable("HOLE"))); } else { items.set(strictnessPosition, cast(Sorts.KItem(), KVariable("HOLE"))); if (kompileOptions.strict()) { items.add(cast(production.nonterminal(j).sort(), KVariable("K" + j))); } else { items.add(KVariable("K" + j));
if (!mod.subsorts().lessThanEq(candidateProduction.nonterminal(i).sort(), possibleParentProduction.nonterminal(i).sort())) {
Sort expectedSort = prod.nonterminal(i).sort(); if (polyPositions.contains(i + 1)) { expectedSort = actualSort;
assert tc.production().nonterminal(nt) == item; Term inner = tc.get(nt); boolean assoc = false;