Search in sources :

Example 16 with Reference

use of suite.node.Reference in project suite by stupidsing.

the class ComparerTest method testOrdinality.

@Test
public void testOrdinality() {
    assertTrue(comparer.compare(Int.of(3), Suite.parse("1 = 2")) < 0);
    assertTrue(comparer.compare(Int.of(3), Suite.parse("a")) < 0);
    assertTrue(comparer.compare(new Reference(), Suite.parse("b")) < 0);
}
Also used : Reference(suite.node.Reference) Test(org.junit.Test)

Example 17 with Reference

use of suite.node.Reference in project suite by stupidsing.

the class Assembler method assemble.

public Bytes assemble(Node input) {
    Generalizer generalizer = new Generalizer();
    Trail trail = new Trail();
    List<Pair<Reference, Node>> lnis = new ArrayList<>();
    for (Node node0 : Tree.iter(input)) {
        Node node = generalizer.generalize(node0);
        Tree tree;
        if ((tree = Tree.decompose(node, TermOp.EQUAL_)) != null)
            if (!Binder.bind(tree.getLeft(), tree.getRight(), trail))
                Fail.t("bind failed");
            else
                ;
        else if ((tree = Tree.decompose(node, TermOp.TUPLE_)) != null)
            lnis.add(Pair.of((Reference) tree.getLeft(), tree.getRight()));
        else
            Fail.t("cannot assemble " + node);
    }
    return assemble(generalizer, preassemble.apply(lnis));
}
Also used : Generalizer(suite.lp.doer.Generalizer) Trail(suite.lp.Trail) Reference(suite.node.Reference) Node(suite.node.Node) ArrayList(java.util.ArrayList) Tree(suite.node.Tree) Pair(suite.adt.pair.Pair)

Example 18 with Reference

use of suite.node.Reference in project suite by stupidsing.

the class PeepholeOptimizer method optimize.

public List<Pair<Reference, Node>> optimize(List<Pair<Reference, Node>> lnis0) {
    List<Pair<Reference, Node>> lnis1 = new ArrayList<>();
    for (Pair<Reference, Node> lni0 : lnis0) {
        Node node0 = lni0.t1;
        Node node1;
        Node[] m;
        if ((m = ADDI__.match(node0)) != null) {
            Node m0 = m[0];
            int i = TreeUtil.evaluate(m[1]);
            if (i == 1)
                node1 = Suite.substitute("INC .0", m0);
            else if (i == -1)
                node1 = Suite.substitute("DEC .0", m0);
            else if (0 < i)
                node1 = Suite.substitute("ADD (.0, .1)", m0, Int.of(i));
            else if (i < 0)
                node1 = Suite.substitute("SUB (.0, .1)", m0, Int.of(-i));
            else
                node1 = Atom.NIL;
        } else if ((m = MOV___.match(node0)) != null) {
            Node m0 = m[0];
            Node m1 = m[1];
            if (m0 == m1)
                node1 = Atom.NIL;
            else if (m0 instanceof Atom && m1 instanceof Int && ((Int) m1).number == 0)
                node1 = Suite.substitute("XOR (.0, .0)", m0);
            else
                node1 = Suite.substitute("MOV (.0, .1)", m0, m1);
        } else
            node1 = node0;
        lnis1.add(Pair.of(lni0.t0, node1));
    }
    return lnis1;
}
Also used : Reference(suite.node.Reference) Node(suite.node.Node) ArrayList(java.util.ArrayList) Atom(suite.node.Atom) Int(suite.node.Int) Pair(suite.adt.pair.Pair)

Example 19 with Reference

use of suite.node.Reference in project suite by stupidsing.

the class StackAssembler method preassemble.

private List<Pair<Reference, Node>> preassemble(List<Pair<Reference, Node>> lnis0) {
    List<Pair<Reference, Node>> lnis1 = new ArrayList<>();
    Deque<int[]> deque = new ArrayDeque<>();
    Trail trail = new Trail();
    int fs = 0, rs = 0;
    for (Pair<Reference, Node> lni0 : lnis0) {
        Node node0 = lni0.t1;
        Node node1;
        Node[] m;
        if ((m = FRBGN_.match(node0)) != null) {
            deque.push(new int[] { fs, rs });
            fs = 0;
            rs = 0;
            node1 = Atom.NIL;
        } else if ((m = FREND_.match(node0)) != null) {
            if (fs != 0)
                node1 = Fail.t("unbalanced frame stack in subroutine definition");
            else if (rs != 0)
                node1 = Fail.t("unbalanced register stack in subroutine definition");
            else {
                int[] arr = deque.pop();
                fs = arr[0];
                rs = arr[1];
            }
            node1 = Atom.NIL;
        } else if ((m = FRGET_.match(node0)) != null)
            if (Binder.bind(m[0], Int.of(-fs), trail))
                node1 = Atom.NIL;
            else
                node1 = Fail.t("cannot bind local variable offset");
        else if ((m = FRPOP_.match(node0)) != null) {
            fs -= 4;
            node1 = Suite.substitute("POP .0", rewrite(rs, m[0]));
        } else if ((m = FRPOPN.match(node0)) != null) {
            Int int_ = (Int) m[0].finalNode();
            fs -= int_.number;
            node1 = Atom.NIL;
        } else if ((m = FRPSH_.match(node0)) != null) {
            fs += 4;
            node1 = Suite.substitute("PUSH .0", rewrite(rs, m[0]));
        } else if ((m = FRPSHN.match(node0)) != null) {
            Int int_ = (Int) m[0].finalNode();
            fs += int_.number;
            node1 = Atom.NIL;
        } else if ((m = LET___.match(node0)) != null)
            if (Binder.bind(m[0], Int.of(TreeUtil.evaluate(m[1])), trail))
                node1 = Atom.NIL;
            else
                node1 = Fail.t("cannot calculate expression");
        else if (node0 == RPOP__) {
            rs--;
            node1 = Atom.NIL;
        } else if (node0 == RPSH__) {
            rs++;
            node1 = Atom.NIL;
        } else if (node0 == RRESTA) {
            fs -= 4 * rs;
            for (int r = rs - 1; 0 <= r; r--) lnis1.add(Pair.of(new Reference(), Suite.substitute("POP .0", getRegister(r))));
            node1 = Atom.NIL;
        } else if (node0 == RSAVEA) {
            for (int r = 0; r < rs; r++) lnis1.add(Pair.of(new Reference(), Suite.substitute("PUSH .0", getRegister(r))));
            fs += 4 * rs;
            node1 = Atom.NIL;
        } else
            node1 = rewrite(rs, node0);
        lnis1.add(Pair.of(lni0.t0, node1));
    }
    return new PeepholeOptimizer().optimize(lnis1);
}
Also used : Reference(suite.node.Reference) Node(suite.node.Node) ArrayList(java.util.ArrayList) ArrayDeque(java.util.ArrayDeque) Int(suite.node.Int) Trail(suite.lp.Trail) Pair(suite.adt.pair.Pair)

Example 20 with Reference

use of suite.node.Reference in project suite by stupidsing.

the class InterpretFunLazy method parse.

private Reference parse(Node node) {
    Prover prover = new Prover(Suite.newRuleSet(List.of("auto.sl", "fc/fc.sl")));
    Reference parsed = new Reference();
    if (!prover.prove(Suite.substitute("fc-parse .0 .1", node, parsed)))
        Fail.t("cannot parse " + node);
    return parsed;
}
Also used : Reference(suite.node.Reference) Prover(suite.lp.doer.Prover)

Aggregations

Reference (suite.node.Reference)38 Node (suite.node.Node)31 Tree (suite.node.Tree)21 Atom (suite.node.Atom)17 ArrayList (java.util.ArrayList)15 Pair (suite.adt.pair.Pair)13 Int (suite.node.Int)13 List (java.util.List)11 Generalizer (suite.lp.doer.Generalizer)10 TermOp (suite.node.io.TermOp)10 Read (suite.streamlet.Read)10 Trail (suite.lp.Trail)9 Dict (suite.node.Dict)9 Tuple (suite.node.Tuple)9 HashMap (java.util.HashMap)8 Map (java.util.Map)7 Binder (suite.lp.doer.Binder)7 Str (suite.node.Str)7 Fail (suite.util.Fail)7 Suite (suite.Suite)6