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(')'); }
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); } }
Set<KLabel> impurities = functions.stream().filter(lbl -> mainModule.attributesFor().apply(lbl).contains(Attribute.IMPURE_KEY)).collect(Collectors.toSet()); impurities.addAll(ancestors(impurities, dependencies)); constants = functions.stream().filter(lbl -> !impurities.contains(lbl) && stream(mainModule.productionsFor().apply(lbl)).filter(p -> p.arity() == 0).findAny().isPresent()).collect(Collectors.toSet());
if (!stream(mod.productionsFor().apply(candidateProduction.klabel().get())).filter(p -> p.sort().equals(sort) && p.arity() == candidateProduction.arity()).anyMatch(possibleParentProduction -> { for (int i = 0; i < candidateProduction.arity(); i++) { if (!mod.subsorts().lessThanEq(candidateProduction.nonterminal(i).sort(), possibleParentProduction.nonterminal(i).sort())) {
if (prod.arity() != 2) { throw KEMException.compilerError("Found a non-binary production with the assoc attribute", prod); if (prod.arity() != 2) { throw KEMException.compilerError("Found a non-binary production with the comm attribute", prod); if (prod.arity() != 2) { throw KEMException.compilerError("Found a non-binary production with the assoc attribute", prod); if (prod.arity() != 2) { throw KEMException.compilerError("Found a non-binary production with the assoc attribute", prod); if (prod.arity() > 0) { sb.append(" axiom"); convertParams(prod.klabel(), false); sb.append("("); String conn = ""; for (int i = 0; i < prod.arity(); i++) { sb.append(conn); sb.append("\\and{"); hasToken = true; } else if (prod.klabel().isDefined()) { for (int i = 0; i < prod.arity(); i++) { sb.append("\\exists{"); convert(sort, false); sb.append("(");