Search in sources :

Example 6 with Pair

use of primal.adt.Pair in project suite by stupidsing.

the class ReversePolish method fromRpn.

public Node fromRpn(Reader reader) throws IOException {
    var br = new BufferedReader(reader);
    var references = new HashMap<String, Reference>();
    var deque = new ArrayDeque<Node>();
    br.lines().filter(elem -> !elem.isEmpty()).forEach(elem -> {
        var type = elem.charAt(0);
        var s = elem.substring(1);
        Node n;
        if (type == '\\')
            n = Atom.of(s);
        else if (type == '^') {
            var a = s.split(":");
            var size = Integer.valueOf(a[3]);
            var children = new ArrayList<Pair<Node, Node>>();
            for (var i = 0; i < size; i++) {
                var key = deque.pop();
                var value = deque.pop();
                children.add(Pair.of(key, value));
            }
            n = new // 
            NodeWrite(// 
            ReadType.valueOf(a[0]), // 
            !Equals.string(a[1], "null") ? Suite.parse(a[1]) : null, // 
            TermOp.valueOf(a[2]), children).node;
        // n = Suite.parse(s);
        } else if (type == 'i')
            n = Int.of(Integer.parseInt(s));
        else if (type == 'r')
            n = references.computeIfAbsent(s, key -> new Reference());
        else if (type == 't') {
            var op = TermOp.valueOf(s);
            var left = deque.pop();
            var right = deque.pop();
            n = Tree.of(op, left, right);
        } else
            n = fail("RPN conversion error: " + elem);
        deque.push(n);
    });
    return deque.pop();
}
Also used : Pair(primal.adt.Pair) Reference(suite.node.Reference) Suite(suite.Suite) Fail.fail(primal.statics.Fail.fail) Build(primal.Verbs.Build) NodeWrite(suite.node.io.Rewrite_.NodeWrite) IOException(java.io.IOException) HashMap(java.util.HashMap) NodeRead(suite.node.io.Rewrite_.NodeRead) Reader(java.io.Reader) Tree(suite.node.Tree) ArrayList(java.util.ArrayList) Node(suite.node.Node) StringReader(java.io.StringReader) Rethrow.ex(primal.statics.Rethrow.ex) Atom(suite.node.Atom) BufferedReader(java.io.BufferedReader) ArrayDeque(java.util.ArrayDeque) Equals(primal.Verbs.Equals) Int(suite.node.Int) ReadType(suite.node.io.Rewrite_.ReadType) HashMap(java.util.HashMap) Reference(suite.node.Reference) Node(suite.node.Node) BufferedReader(java.io.BufferedReader) ArrayDeque(java.util.ArrayDeque) Pair(primal.adt.Pair)

Example 7 with Pair

use of primal.adt.Pair in project suite by stupidsing.

the class AsmSl method assemble.

public Bytes assemble(String in0) {
    var whitespaces = Collections.singleton('\n');
    Fun<String, List<Run>> gct = CommentPreprocessor.ofGroupComment(whitespaces)::preprocess;
    Fun<String, List<Run>> lct = CommentPreprocessor.ofLineComment(whitespaces)::preprocess;
    var in1 = Preprocess.transform(List.of(gct, lct), in0).k;
    var generalizer = new Generalizer();
    var lines = List.of(in1.split("\n"));
    Pair<String, String> pe;
    var start = 0;
    while ((pe = Split.string(lines.get(start), "=")) != null) {
        generalizer.getVariable(Atom.of(pe.k)).bound(Suite.parse(pe.v));
        start++;
    }
    var lnis = // 
    Read.from(// 
    Right.of(lines, start)).map(line -> Split.strl(line, "\t").map((label, command) -> {
        var reference = // 
        Is.notBlank(label) ? // 
        generalizer.getVariable(Atom.of(label)) : new Reference();
        var instruction = generalizer.generalize(Suite.parse(command));
        return Pair.of(reference, instruction);
    })).toList();
    return assemble(generalizer, lnis);
}
Also used : Asm(suite.asm.Assembler.Asm) SewingProverBuilder2(suite.lp.search.SewingProverBuilder2) Fail.fail(primal.statics.Fail.fail) Fun(primal.fp.Funs.Fun) Amd64Assemble(suite.assembler.Amd64Assemble) Right(primal.Verbs.Right) Is(primal.Verbs.Is) ArrayList(java.util.ArrayList) Node(suite.node.Node) CommentPreprocessor(suite.parser.CommentPreprocessor) Preprocess(suite.text.Preprocess) Utf8(primal.Nouns.Utf8) Split(primal.MoreVerbs.Split) Run(suite.text.Preprocess.Run) Take(primal.Verbs.Take) Binder(suite.lp.doer.Binder) RuleSet(suite.lp.kb.RuleSet) Generalizer(suite.lp.doer.Generalizer) Amd64Mode(suite.assembler.Amd64Mode) Pair(primal.adt.Pair) Reference(suite.node.Reference) Suite(suite.Suite) Amd64Parse(suite.assembler.Amd64Parse) Finder(suite.lp.search.ProverBuilder.Finder) TermOp(suite.node.io.TermOp) Read(primal.MoreVerbs.Read) Bytes(primal.primitive.adt.Bytes) Tree(suite.node.Tree) List(java.util.List) Atom(suite.node.Atom) Fail.failBool(primal.statics.Fail.failBool) BytesBuilder(primal.primitive.adt.Bytes.BytesBuilder) SwitchNode(suite.node.io.SwitchNode) Int(suite.node.Int) Collections(java.util.Collections) Str(suite.node.Str) Generalizer(suite.lp.doer.Generalizer) Reference(suite.node.Reference) ArrayList(java.util.ArrayList) List(java.util.List)

Example 8 with Pair

use of primal.adt.Pair in project suite by stupidsing.

the class P0CrudeScript method parse.

public Funp parse(String in) {
    // "{ return 1 + 2 * 3; }"
    var ebnf = ex(() -> new Ebnf(new FileReader("src/main/ebnf/crude-script.ebnf")));
    var ast = ebnf.parse("crude-script", in);
    var node = new Object() {

        private Node node(Ast ast) {
            var entity = ast.entity;
            var children = ast.children;
            var atom = Atom.of(entity);
            Node node;
            if (entity.startsWith("<"))
                node = new Str(in.substring(ast.start, ast.end));
            else
                node = Read.from(children).reverse().<Node>fold(Atom.NIL, (n, c) -> Tree.ofAnd(node(c), n));
            return TreeTuple.of(atom, node);
        }
    }.node(ast);
    return new Object() {

        private Funp crudeScript(Node node) {
            return new // 
            SwitchNode<Funp>(// 
            node).match("crude-script (.0,)", a -> {
                return stmt(a);
            }).nonNullResult();
        }

        private Funp stmt(Node node) {
            return new // 
            SwitchNode<Funp>(// 
            node).match("statement (expression (.0,),)", a -> {
                return expr(a);
            }).match("statement (statement-return (.0,),)", a -> {
                return expr(a);
            }).match("statement1 (.0,)", a -> {
                return stmt(a);
            }).match("statement-block (statement-let (bind (<IDENTIFIER> .0,), .1,), .2)", (a, b, c) -> {
                return FunpDefine.of(Str.str(a), expr(b), stmt(c), Fdt.L_MONO);
            }).match("statement-block (.0,)", a -> {
                return stmt(a);
            }).match("statement-for (.0, .1, .2, .3,)", (a, b, c, d) -> {
                return expr(a);
            }).match("statement-if (.0, .1, .2,)", (a, b, c) -> {
                return FunpIf.of(expr(a), stmt(b), stmt(c));
            }).match("statement-while (.0, .1,)", (a, b) -> {
                return expr(b);
            }).nonNullResult();
        }

        private Funp expr(Node node) {
            return new // 
            SwitchNode<Funp>(// 
            node).match("<IDENTIFIER> .0", s -> {
                return FunpVariable.of(Str.str(s));
            }).match("<INTEGER_LITERAL> .0", s -> {
                return FunpNumber.ofNumber(Integer.valueOf(Str.str(s)));
            }).match("<STRING_LITERAL> .0", s -> {
                return fail();
            }).match("constant (.0,)", a -> {
                return expr(a);
            }).match("expression (.0,)", a -> {
                return expr(a);
            }).match("expression-add (.0, .1)", (a, b) -> {
                return Tree.read(b).fold(expr(a), (f, c) -> FunpTree.of(FunpOp.PLUS__, f, expr(c)));
            }).match("expression-and (.0,)", a -> {
                return expr(a);
            }).match("expression-as (.0,)", a -> {
                return expr(a);
            }).match("expression-assign (.0, .1)", (a, b) -> {
                return expr(a);
            }).matchArray("expression-array .0", m -> {
                return FunpArray.of(Read.from(m).map(this::expr).toList());
            }).match("expression-bool-and (.0, .1)", (a, b) -> {
                return Tree.read(b).fold(expr(a), (f, c) -> FunpTree.of(FunpOp.BIGAND, f, expr(c)));
            }).match("expression-bool-not (.0,)", a -> {
                return expr(a);
            }).match("expression-bool-or (.0, .1)", (a, b) -> {
                return Tree.read(b).fold(expr(a), (f, c) -> FunpTree.of(FunpOp.BIGOR_, f, expr(c)));
            }).match("expression-compare (.0,)", a -> {
                return expr(a);
            }).match("expression-dict .0", a -> {
                var list = // 
                Tree.read(// 
                a).chunk(// 
                2).map(// 
                o -> o.toFixie().map((k, v) -> Pair.of(Str.str(k), expr(v)))).toList();
                return FunpStruct.of(list);
            }).match("expression-div (.0, .1)", (a, b) -> {
                return // 
                Tree.read(// 
                b).chunk(// 
                2).fold(expr(a), (f, o) -> o.toFixie().map((op, d) -> {
                    return new // 
                    SwitchNode<Funp>(// 
                    op).matchArray("'/'", m_ -> {
                        return FunpTree.of(FunpOp.DIVIDE, f, expr(d));
                    }).matchArray("'%'", m_ -> {
                        return FunpTree.of(FunpOp.MODULO, f, expr(d));
                    }).nonNullResult();
                }));
            }).match("expression-invoke (.0, .1)", (a, b) -> {
                return Tree.read(b).fold(expr(a), (f, c) -> FunpApply.of(f, expr(c)));
            }).match("expression-mul (.0, .1)", (a, b) -> {
                return Tree.read(b).fold(expr(a), (f, c) -> FunpTree.of(FunpOp.MULT__, f, expr(c)));
            }).match("expression-not (.0,)", a -> {
                return expr(a);
            }).match("expression-lambda (bind (<IDENTIFIER> (.0,),), expression (.1,),)", (a, b) -> {
                return FunpLambda.of(Str.str(a), expr(b));
            }).match("expression-lambda (bind (<IDENTIFIER> (.0,),), statement-block (.1),)", (a, b) -> {
                return FunpLambda.of(Str.str(a), stmt(b));
            }).match("expression-obj (.0,)", a -> {
                return expr(a);
            }).match("expression-or (.0,)", a -> {
                return expr(a);
            }).match("expression-pp .0", a -> {
                var pat0 = Suite.pattern("op-inc-dec ('++' (),)");
                var pat1 = Suite.pattern("op-inc-dec ('--' (),)");
                var list = Tree.read(a).toList();
                Obj_Int<Node> f = op -> pat0.match(op) != null ? 1 : pat1.match(op) != null ? -1 : 0;
                int s = 0, e = list.size() - 1, c;
                int pre_ = 0, post = 0;
                while ((c = f.apply(list.get(s))) != 0) {
                    pre_ += c;
                    s++;
                }
                while ((c = f.apply(list.get(e))) != 0) {
                    post += c;
                    e--;
                }
                var e0 = expr(list.get(s));
                var ref0 = FunpReference.of(e0);
                var e1 = pre_ == 0 ? e0 : FunpDoAssignRef.of(ref0, FunpTree.of(FunpOp.PLUS__, e0, FunpNumber.ofNumber(pre_)), e0);
                var e2 = post == 0 ? e1 : Fail.<Funp>fail();
                return s == e ? e2 : fail();
            }).match("expression-prop (.0, .1)", (a, b) -> {
                return // 
                Tree.read(// 
                b).chunk(// 
                2).fold(expr(a), (f, o) -> o.toFixie().map((k, v) -> {
                    return new // 
                    SwitchNode<Funp>(// 
                    k).matchArray("'.'", m_ -> {
                        return FunpField.of(FunpReference.of(f), Str.str(v));
                    }).matchArray("'['", m_ -> {
                        return FunpIndex.of(FunpReference.of(f), expr(v));
                    }).matchArray("'('", m_ -> {
                        return FunpApply.of(expr(v), f);
                    }).nonNullResult();
                }));
            }).match("expression-shift (.0,)", a -> {
                return expr(a);
            }).match("expression-sub (.0,)", a -> {
                return expr(a);
            }).match("expression-tuple .0", a -> {
                var list = new ArrayList<Pair<String, Funp>>();
                var i = 0;
                for (var child : Tree.read(a)) list.add(Pair.of("t" + i++, expr(child)));
                return FunpStruct.of(list);
            }).match("expression-xor (.0,)", a -> {
                return expr(a);
            }).nonNullResult();
        }
    }.crudeScript(node);
}
Also used : FunpDoAssignRef(suite.funp.P0.FunpDoAssignRef) Fdt(suite.funp.P0.Fdt) Fail.fail(primal.statics.Fail.fail) Ast(suite.ebnf.Ebnf.Ast) FunpArray(suite.funp.P0.FunpArray) FunpDefine(suite.funp.P0.FunpDefine) FunpIndex(suite.funp.P0.FunpIndex) FunpLambda(suite.funp.P0.FunpLambda) FunpReference(suite.funp.P0.FunpReference) ArrayList(java.util.ArrayList) Funp_(suite.funp.Funp_) Node(suite.node.Node) FunpApply(suite.funp.P0.FunpApply) FunpIf(suite.funp.P0.FunpIf) Ebnf(suite.ebnf.Ebnf) Obj_Int(primal.primitive.IntPrim.Obj_Int) Fail(primal.statics.Fail) FunpOp(suite.funp.FunpOp) Pair(primal.adt.Pair) Suite(suite.Suite) FunpTree(suite.funp.P0.FunpTree) FunpField(suite.funp.P0.FunpField) Read(primal.MoreVerbs.Read) Tree(suite.node.Tree) Funp(suite.funp.Funp_.Funp) Rethrow.ex(primal.statics.Rethrow.ex) FunpNumber(suite.funp.P0.FunpNumber) Atom(suite.node.Atom) SwitchNode(suite.node.io.SwitchNode) FileReader(java.io.FileReader) FunpStruct(suite.funp.P0.FunpStruct) FunpVariable(suite.funp.P0.FunpVariable) TreeTuple(suite.node.tree.TreeTuple) Str(suite.node.Str) Ast(suite.ebnf.Ebnf.Ast) Node(suite.node.Node) SwitchNode(suite.node.io.SwitchNode) SwitchNode(suite.node.io.SwitchNode) Obj_Int(primal.primitive.IntPrim.Obj_Int) Str(suite.node.Str) Funp(suite.funp.Funp_.Funp) Ebnf(suite.ebnf.Ebnf) FileReader(java.io.FileReader) Pair(primal.adt.Pair)

Aggregations

Pair (primal.adt.Pair)8 Read (primal.MoreVerbs.Read)6 ArrayList (java.util.ArrayList)5 List (java.util.List)5 Map (java.util.Map)4 HashMap (java.util.HashMap)3 Build (primal.Verbs.Build)3 Equals (primal.Verbs.Equals)3 Fun (primal.fp.Funs.Fun)3 Fail.fail (primal.statics.Fail.fail)3 Streamlet (primal.streamlet.Streamlet)3 Suite (suite.Suite)3 Atom (suite.node.Atom)3 Node (suite.node.Node)3 Tree (suite.node.Tree)3 ArrayDeque (java.util.ArrayDeque)2 IdentityHashMap (java.util.IdentityHashMap)2 Set (java.util.Set)2 Split (primal.MoreVerbs.Split)2 Is (primal.Verbs.Is)2