use of mb.nabl2.terms.Terms in project nabl by metaborg.
the class ScopeGraphLogPrimitive method call.
@Override
public Optional<ITerm> call(IScopeGraphContext<?> context, ITerm term, List<ITerm> terms) throws InterpreterException {
final ITerm messageTerm = terms.get(0);
final String message = M.stringValue().match(messageTerm).orElseGet(() -> messageTerm.toString());
logger.log(level(context), "{}", message);
return fatal() ? Optional.empty() : Optional.of(term);
}
use of mb.nabl2.terms.Terms in project nabl by metaborg.
the class StrategoTerms method toStratego.
// to
public IStrategoTerm toStratego(ITerm term) {
IStrategoTerm strategoTerm = term.match(Terms.cases(// @formatter:off
appl -> {
List<IStrategoTerm> args = appl.getArgs().stream().map(arg -> toStratego(arg)).collect(Collectors.toList());
IStrategoTerm[] argArray = args.toArray(new IStrategoTerm[args.size()]);
return appl.getOp().equals(Terms.TUPLE_OP) ? termFactory.makeTuple(argArray) : termFactory.makeAppl(termFactory.makeConstructor(appl.getOp(), appl.getArity()), argArray);
}, list -> toStrategoList(list), string -> termFactory.makeString(string.getValue()), integer -> termFactory.makeInt(integer.getValue()), blob -> new StrategoBlob(blob.getValue()), var -> {
throw new IllegalArgumentException("Cannot convert specialized terms to Stratego.");
}));
strategoTerm = putAttachments(strategoTerm, term.getAttachments());
return strategoTerm;
}
use of mb.nabl2.terms.Terms in project nabl by metaborg.
the class ScopeGraphContextPrimitive method call.
public Optional<? extends IStrategoTerm> call(IScopeGraphContext<?> context, IStrategoTerm sterm, List<IStrategoTerm> sterms, ITermFactory factory) throws InterpreterException {
StrategoTerms strategoTerms = new StrategoTerms(factory);
ITerm term = ConstraintTerms.specialize(strategoTerms.fromStratego(sterm));
List<ITerm> terms = sterms.stream().map(strategoTerms::fromStratego).map(ConstraintTerms::specialize).collect(Collectors.toList());
Optional<? extends ITerm> result = call(context, term, terms);
return result.map(ConstraintTerms::explicate).map(strategoTerms::toStratego);
}
use of mb.nabl2.terms.Terms in project nabl by metaborg.
the class StrategoTerms method toStrategoList.
// NB. This function does not preserve locks, it depends on toStratego for that.
private IStrategoTerm toStrategoList(IListTerm list) {
final LinkedList<IStrategoTerm> terms = Lists.newLinkedList();
final LinkedList<ImmutableClassToInstanceMap<Object>> attachments = Lists.newLinkedList();
while (list != null) {
attachments.push(list.getAttachments());
list = list.match(ListTerms.<IListTerm>cases(// @formatter:off
cons -> {
terms.push(toStratego(cons.getHead()));
return cons.getTail();
}, nil -> {
return null;
}, var -> {
throw new IllegalArgumentException("Cannot convert specialized terms to Stratego.");
}));
}
IStrategoList strategoList = termFactory.makeList();
putAttachments(strategoList, attachments.pop());
while (!terms.isEmpty()) {
strategoList = termFactory.makeListCons(terms.pop(), strategoList);
putAttachments(strategoList, attachments.pop());
}
return strategoList;
}
use of mb.nabl2.terms.Terms in project nabl by metaborg.
the class PersistentUnifier method findVarRecursive.
private ITerm findVarRecursive(final ITermVar var, final Set<ITermVar> stack, final java.util.Map<ITermVar, ITerm> visited) {
final ITermVar rep = findRep(var);
final ITerm instance;
if (!visited.containsKey(rep)) {
stack.add(rep);
visited.put(rep, rep);
final ITerm term = terms().get(rep);
instance = term != null ? findTermRecursive(term, stack, visited) : rep;
visited.put(rep, instance);
stack.remove(rep);
return instance;
} else if (stack.contains(rep)) {
throw new IllegalArgumentException("Recursive terms cannot be instantiated.");
} else {
instance = visited.get(rep);
}
return instance;
}
Aggregations