use of suite.util.FunUtil.Fun in project suite by stupidsing.
the class Assembler method assemble.
public Bytes assemble(String in0) {
Set<Character> whitespaces = Collections.singleton('\n');
Fun<String, List<Run>> gct = CommentPreprocessor.groupCommentPreprocessor(whitespaces);
Fun<String, List<Run>> lct = CommentPreprocessor.lineCommentPreprocessor(whitespaces);
String in1 = Preprocess.transform(List.of(gct, lct), in0).t0;
Generalizer generalizer = new Generalizer();
List<String> lines = List.of(in1.split("\n"));
Pair<String, String> pe;
int start = 0;
while (!(pe = String_.split2(lines.get(start), "=")).t1.isEmpty()) {
generalizer.getVariable(Atom.of(pe.t0)).bound(Suite.parse(pe.t1));
start++;
}
List<Pair<Reference, Node>> lnis = //
Read.from(//
List_.right(lines, start)).map(line -> {
Pair<String, String> pt = String_.split2(line, "\t");
String label = pt.t0;
String command = pt.t1;
Reference reference = String_.isNotBlank(label) ? generalizer.getVariable(Atom.of(label)) : null;
Node instruction = generalizer.generalize(Suite.parse(command));
return Pair.of(reference, instruction);
}).toList();
return assemble(generalizer, lnis);
}
use of suite.util.FunUtil.Fun in project suite by stupidsing.
the class BuildLr method build.
private Blr build(IList<Pair<String, Set<String>>> ps, Grammar eg, Transition nextx) {
Fun<Streamlet2<String, Transition>, Blr> mergeAll = st2 -> {
Transition next = newTransition(readLookahead.readLookahead(eg, nextx.keySet()));
State state1 = newState(nextx);
st2.sink((egn, next1) -> {
next.put_(egn, Pair.of(state1, null));
merges.add(Pair.of(next, next1));
});
return new Blr(1, next);
};
Pair<String, Set<String>> k;
Blr blr;
switch(eg.type) {
case AND___:
if (!eg.children.isEmpty()) {
Grammar tail = new Grammar(GrammarType.AND___, List_.right(eg.children, 1));
Blr blr1 = build(ps, tail, nextx);
Blr blr0 = build(ps, eg.children.get(0), blr1.next);
blr = new Blr(blr0.nTokens + blr1.nTokens, blr0.next);
} else
blr = new Blr(0, nextx);
break;
case ENTITY:
k = Pair.of(eg.content, nextx.keySet());
Transition next1 = transitions.computeIfAbsent(k, k_ -> new Transition());
blr = mergeAll.apply(Read.each2(eg.content, next1));
break;
case NAMED_:
Reduce reduce = new Reduce();
Transition next = newTransition(nextx.keySet(), Pair.of(null, reduce));
Blr blr1 = build(ps, eg.children.get(0), next);
reduce.n = blr1.nTokens;
reduce.name = eg.content;
blr = new Blr(1, blr1.next);
break;
case OR____:
List<Pair<String, Transition>> pairs = new ArrayList<>();
for (Grammar eg1 : Read.from(eg.children)) {
String egn = "OR." + System.identityHashCode(eg1);
pairs.add(Pair.of(egn, build(ps, new Grammar(GrammarType.NAMED_, egn, eg1), nextx).next));
}
blr = mergeAll.apply(Read.from2(pairs));
break;
case STRING:
State state1 = newState(nextx);
blr = new Blr(1, kv(eg.content, state1));
break;
default:
blr = Fail.t("LR parser cannot recognize " + eg.type);
}
return blr;
}
use of suite.util.FunUtil.Fun in project suite by stupidsing.
the class InterpretFunLazy method lazy.
public Thunk_ lazy(Node node) {
Node parsed = parse(node);
Map<String, Thunk_> df = new HashMap<>();
df.put(TermOp.AND___.name, binary((a, b) -> new Pair_(a, b)));
df.put("fst", () -> new Fun_(in -> ((Pair_) in.get()).first_));
df.put("if", () -> new Fun_(a -> () -> new Fun_(b -> () -> new Fun_(c -> a.get() == Atom.TRUE ? b : c))));
df.put("snd", () -> new Fun_(in -> ((Pair_) in.get()).second));
for (Entry<Operator, IntInt_Bool> e : TreeUtil.boolOperations.entrySet()) {
IntInt_Bool fun = e.getValue();
df.put(e.getKey().getName(), binary((a, b) -> b(fun.apply(compare(a.get(), b.get()), 0))));
}
for (Entry<Operator, IntInt_Int> e : TreeUtil.intOperations.entrySet()) {
IntInt_Int fun = e.getValue();
df.put(e.getKey().getName(), binary((a, b) -> Int.of(fun.apply(i(a), i(b)))));
}
List<String> keys = df.keySet().stream().sorted().collect(Collectors.toList());
Lazy_ lazy0 = new Lazy_(0, IMap.empty());
Frame frame = new Frame(null);
for (String key : keys) {
lazy0 = lazy0.put(Atom.of(key));
frame.add(df.get(key));
}
return lazy0.lazy_(parsed).apply(frame);
}
use of suite.util.FunUtil.Fun in project suite by stupidsing.
the class InterpretFunLazy0 method lazy.
public Thunk_ lazy(Node node) {
Thunk_ error = () -> Fail.t("error termination");
IMap<String, Thunk_> env = IMap.empty();
env = env.put(Atom.TRUE.name, () -> Atom.TRUE);
env = env.put(Atom.FALSE.name, () -> Atom.FALSE);
env = env.put(TermOp.AND___.name, () -> new Fun_(a -> () -> new Fun_(b -> () -> new Pair_(a, b))));
env = env.put(ERROR.name, error);
env = env.put(FST__.name, () -> new Fun_(in -> ((Pair_) in.get()).first));
env = env.put(SND__.name, () -> new Fun_(in -> ((Pair_) in.get()).second));
for (Entry<Operator, IntInt_Bool> e : TreeUtil.boolOperations.entrySet()) {
IntInt_Bool fun = e.getValue();
env = env.put(e.getKey().getName(), () -> new Fun_(a -> () -> new Fun_(b -> () -> b(fun.apply(i(a), i(b))))));
}
for (Entry<Operator, IntInt_Int> e : TreeUtil.intOperations.entrySet()) {
IntInt_Int fun = e.getValue();
env = env.put(e.getKey().getName(), () -> new Fun_(a -> () -> new Fun_(b -> () -> Int.of(fun.apply(i(a), i(b))))));
}
return lazy_(node).apply(env);
}
use of suite.util.FunUtil.Fun in project suite by stupidsing.
the class P2InferType method captureLambdas.
private Funp captureLambdas(Funp node0) {
class Capture {
private Fun<String, Funp> accesses;
private ISet<String> locals;
private ISet<String> globals;
private Capture(Fun<String, Funp> accesses, ISet<String> locals, ISet<String> globals) {
this.accesses = accesses;
this.locals = locals;
this.globals = globals;
}
private Funp capture(Funp n) {
return inspect.rewrite(Funp.class, this::capture_, n);
}
private Funp capture_(Funp n) {
return //
n.<//
Funp>switch_().applyIf(FunpDefine.class, f -> f.apply((isPolyType, var, value, expr) -> {
Capture c1 = new Capture(accesses, locals.add(var), globals);
return FunpDefine.of(isPolyType, var, capture(value), c1.capture(expr));
})).applyIf(FunpDefineRec.class, f -> f.apply((vars, expr) -> {
List<Pair<String, Funp>> vars1 = new ArrayList<>();
ISet<String> locals1 = locals;
for (Pair<String, Funp> pair : vars) {
locals1 = locals1.add(pair.t0);
vars1.add(Pair.of(pair.t0, capture(pair.t1)));
}
Capture c1 = new Capture(accesses, locals1, globals);
return FunpDefineRec.of(vars1, c1.capture(expr));
})).applyIf(FunpGlobal.class, f -> f.apply((var, value, expr) -> {
Capture c1 = new Capture(accesses, locals, globals.add(var));
return FunpGlobal.of(var, capture(value), c1.capture(expr));
})).applyIf(FunpIterate.class, f -> f.apply((var, init, cond, iterate) -> {
Capture c1 = new Capture(accesses, locals.add(var), globals);
return FunpIterate.of(var, capture(init), c1.capture(cond), c1.capture(iterate));
})).applyIf(FunpLambda.class, f -> f.apply((var, expr) -> {
ISet<String> locals1 = ISet.empty();
String capn = "cap" + Util.temp();
FunpVariable cap = FunpVariable.of(capn);
FunpReference ref = FunpReference.of(cap);
Set<String> set = new HashSet<>();
List<Pair<String, Funp>> list = new ArrayList<>();
FunpStruct struct = FunpStruct.of(list);
Capture c1 = new Capture(v -> {
if (set.add(v))
list.add(Pair.of(v, FunpVariable.of(v)));
return FunpField.of(ref, v);
}, locals1.add(capn).add(var), globals);
return FunpGlobal.of(capn, struct, FunpLambdaCapture.of(var, capn, cap, c1.capture(expr)));
// TODO allocate cap on heap
// TODO free cap after use
})).applyIf(FunpVariable.class, f -> f.apply(var -> {
return locals.contains(var) || globals.contains(var) ? f : accesses.apply(var);
})).result();
}
}
return new Capture(v -> Fail.t(), ISet.empty(), ISet.empty()).capture(node0);
}
Aggregations