def _resolve(self, tokens, filename, passN= 0 ):
    self.filename = filename
    self.iter = 0

    self.tokens = tokens

    while self.iter < len(tokens) - 1 :
        b = self.thisToken().token

        if passN == 2:
            if b == "import":
                ImportParser.importParser(self, True)
            elif b == "def" :
                if self.indentLevel == 0:
                    nex = self.lookInfront()

                    Parser.addBookmark(self)
                    funcHead(self)
                    Parser.returnBookmark(self)
        elif passN == 1:
            if b == "import":
                ImportParser.importParser(self, True)

            elif b == "type":
                Parser.addBookmark(self)
                Struct.typeParser(self, decl= True)
                Parser.returnBookmark(self)

        elif passN == 0:
            if b == "type":
                Scope.addVar(Tree.Node(self), self, self.nextToken().token, Scope.Type(True, Types.StructInit(self.thisToken().token)))

                self.structs[self.package][self.thisToken().token] = Struct.Struct(self.thisToken().token, [],[], {})
                self.structs[self.package][self.thisToken().token].methods = {}

        if b == "\n":
            Parser.addBookmark(self)
            Parser.newLine(self)
            Parser.returnBookmark(self)

        self.nextToken()

    for i in self.imports:
        if not i in self.allImports[self.package]:
            self.allImports[self.package].append(i)

    self.imports = []

    self.lineNumber = 1
    self.normalIndent = 0
Example #2
0
def start(run= False, dev= False, init= False):
    try:
        opt = 0
        skip = 0

        outputFile = ""

        for (iter, i) in enumerate(sys.argv[2:]):
            if skip > 0:
                continue

            skip -= 1
            if i == "-O3":
                opt = 3
            elif i == "-O2":
                opt = 2
            elif i == "-o":
                outputFile = sys.argv[iter + 3]
                skip = 1
            elif i == "-O1":
                opt = 1
            else:
                Error.error("unknown argument '" + i + "'.")

        files = getCompilationFiles()
        allfilenames = []
        allsources = []

        sources = {}
        filenames = {}

        for c in files:
            sources[c] = []
            filenames[c] = []
            for i in files[c]:
                try:
                    file = open(os.path.join(i[0], i[1]), mode="r")
                    r = file.read()
                    allsources.append(r)
                    sources[c].append(r)

                    if i[1][0].upper() == i[1][0]:
                        Error.error("file name must be lowercase")

                    filenames[c].append((c, i[1][:-4]))
                    allfilenames.append((c, i[1][:-4]))

                    file.close()
                except FileNotFoundError:
                    Error.error("file " + i[1] +", not found")

        if outputFile == "":
            port = open("src/port.json")

            data = port.read()
            outputFile = (json.loads(data)["name"])
            port.close()

        if filenames == []:
            Error.error("no input files")

        """
        import cProfile

        profile = cProfile.Profile()
        profile.enable()
        """

        time1 = time()

        # print ("============= Compiling ==============\n")

        """
        for i in lexed:
            print(i.token+"_"+i.type)
        """

        lexed = Lexer.lex(sources, filenames)
        #print("lexed")

        declarations = Parser.Parser(lexed, filenames)
        declarations.files = files
        declarations.lexed = lexed
        declarations.filenames = filenames
        declarations.opt = opt
        declarations.compiled = {}
        declarations.externFuncs = {"main": []}

        ResolveSymbols.resolve(declarations)

        #print("declarations")

        if ImportParser.shouldCompile(False, "main", declarations):
            parser = Parser.Parser(lexed["main"], filenames["main"])
            ResolveSymbols.insert(declarations, parser, only= True)

            parser.files = files
            parser.lexed = lexed
            parser.filenames = filenames
            parser.compiled = declarations.compiled
            parser.compiled["main"] = None

            parsed = parser.parse()

            parser.compiled["main"] = (True, (parsed, parser.externFuncs["main"]))

            import AST as Tree
            allCode = Tree.Root()

            if opt > 0:
                for d in parser.compiled:
                    allCode.addNode(parser.compiled[d][1][0])
                optimize(allCode, opt)

            #print("parsing")

            for i in parser.compiled:
                if parser.compiled[i][0]:
                    CodeGen.CodeGen(i, parser.compiled[i][1][0], parser.compiled[i][1][1]).compile(opt=opt)

            l = CodeGen.link(parser.compiled, outputFile, run=run, opt= opt, dev= dev)
            print("Compilation took : "+str(time() - time1))
            return (True, l)
        elif run:
            CodeGen.exec(outputFile)
        elif init:
            return (True, open("bin/"+outputFile+".js").read())
        elif dev:
            return (False, "")

        print("Compilation took : "+str(time() - time1))
    except EOFError as e:
        if dev:
            return (False, str(error))
        else:
            print(e, file= sys.stderr)