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
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)