Package litil.playground

Source Code of litil.playground.Litil

package litil.playground;

import litil.TypeScope;
import litil.ast.AstNode;
import litil.ast.Type;
import litil.eval.Evaluator;
import litil.eval.Prelude;
import litil.lexer.BaseLexer;
import litil.lexer.LookaheadLexerWrapper;
import litil.lexer.StructuredLexer;
import litil.parser.LitilParser;
import litil.tc.HMTypeChecker;
import litil.tc.TypeError;

import java.io.*;
import java.util.Arrays;

public class Litil {
    public static void main(String[] args) {
        String filename = "/Users/jawher/Dropbox/coding/jaml/target/classes/litil/eval/s99.ltl";
        boolean tc = true;
        boolean ev = true;
        AstNode node = null;
        try {
            node = parseFile(filename);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return;
        }
        //System.out.println(node);
        System.out.println("=============");

        if (tc) {
            System.out.println("Type checking ...");
            try {
                TypeScope typeEnv = trootScope().child();
                new HMTypeChecker().analyze(node, typeEnv);
                System.out.println("All is good");
            } catch (TypeError e) {
                System.err.println(e.getMessage());
                return;
            }
        }

        if (ev) {
            System.out.println("Evaluating ...");
            Evaluator evaluator = new Evaluator();
            System.out.println("-------------------");

            System.out.println("--" + evaluator.eval(node, Prelude.rootScope()));
        }
    }

    private static AstNode parseFile(String file) throws FileNotFoundException {
        Reader reader = new FileReader(file);
        LitilParser p = new LitilParser(new LookaheadLexerWrapper(new StructuredLexer(new BaseLexer(reader), "  ")));
        p.debug = false;
        p.prtDbg = false;

        return p.program();
    }

    private static TypeScope trootScope() {
        TypeScope res = new TypeScope();
        res.define("-/1", Type.Function(Type.INT, Type.INT));
        res.define("+", Type.Function(Arrays.asList(Type.INT, Type.INT), Type.INT));
        res.define("-", Type.Function(Arrays.asList(Type.INT, Type.INT), Type.INT));
        res.define("*", Type.Function(Arrays.asList(Type.INT, Type.INT), Type.INT));
        res.define("/", Type.Function(Arrays.asList(Type.INT, Type.INT), Type.INT));
        res.define("%", Type.Function(Arrays.asList(Type.INT, Type.INT), Type.INT));

        res.define(">", Type.Function(Arrays.asList(Type.INT, Type.INT), Type.BOOL));
        res.define("<", Type.Function(Arrays.asList(Type.INT, Type.INT), Type.BOOL));

        Type.Variable a = new Type.Variable();
        res.define("=", Type.Function(Arrays.asList(a, a), Type.BOOL));

        res.define("int2str", Type.Function(Type.INT, Type.STR));
        res.define("print", Type.Function(Type.STR, Type.UNIT));
        res.define("error", Type.Function(Type.STR, new Type.Variable()));
        return res;
    }

}
TOP

Related Classes of litil.playground.Litil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.