Esempio n. 1
0
def _resolve(self, tokens, filename, passN= 0 ):
    if self.hotswap and not ImportParser.shouldCompile(False, self.package, self):
        return

    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)
                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].add(i)


    self.imports = []

    self.lineNumber = 1
    self.normalIndent = 0
Esempio n. 2
0
def resolve(self):
    tokens = self.tokens
    filenames = self.filename

    for c in filenames:
        self._filename = self.filenames[c]
        self.package = c
        self.opackage = c

        if not self.hotswap or ImportParser.shouldCompile(False, c, self):
            if c in self.contextFields:
                for i in self.contextFields[c]:
                    del self.contextType[i]

            PackageParser.packDec(self, c, pack=True)
            if self.package != "_global":
                self.scope[self.package] = [{}]
                self.structs[self.package] = {}
                self.interfaces[self.package] = {}

        if not c in self.allImports:
            self.allImports[c] = []

        for i in range(len(tokens[c])):
            _resolve(self, tokens[c][i], self._filename[i][1], passN=0)

    for n in range(1, 3):
        start = time()
        for c in filenames:
            self._filename = self.filenames[c]
            if len(filenames[c]) == 0:
                continue

            self.package = c
            self.opackage = c

            for i in range(len(tokens[c])):
                if self.package == "_global" and i == len(tokens[c]) - 1:
                    self.setArrayTypes()
                _resolve(self, tokens[c][i], self._filename[i][1], passN=n)

    self.rootAst = Tree.Root()
    self.currentNode = self.rootAst

    self.tokens = tokens
    self.filename = filenames

    return self
Esempio n. 3
0
def resolve(self):
    tokens = self.tokens
    filenames = self.filename

    for c in filenames:
        self._filename = self.filenames[c]
        PackageParser.packDec(self, c, pack=True)
        if self.hotswap and ImportParser.shouldCompile(False, self.package,
                                                       self):
            self.scope[self.package] = [{}]
            self.structs[self.package] = {}
            self.interfaces[self.package] = {}

        if not c in self.allImports:
            self.allImports[c] = []

        for i in range(len(tokens[c])):
            _resolve(self, tokens[c][i], self._filename[i][1], passN=0)

    for n in range(1, 3):
        for c in filenames:
            self._filename = self.filenames[c]
            if len(filenames[c]) == 0:
                continue

            self.package = c
            self.opackage = c

            for i in range(len(tokens[c])):
                _resolve(self, tokens[c][i], self._filename[i][1], passN=n)

    self.rootAst = Tree.Root()
    self.currentNode = self.rootAst

    self.tokens = tokens
    self.filename = filenames

    return self
Esempio n. 4
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)
Esempio n. 5
0
        def compile(target, sources, filenames, former=None):
            global global_parser

            global_parser = cache

            #print(cache.usedModules)

            lexed = Lexer.lex(target, sources, filenames, files, cache,
                              cache.lexed if cache else {}, transforms)

            declarations = Parser.Parser(lexed, filenames)
            declarations.hotswap = False
            declarations.shouldCompile = {}
            declarations.atoms = 0
            declarations.atomTyp = False
            declarations.outputFile = outputFile
            declarations.jsFiles = [
                b for (a, b) in clientLinkWithFiles + linkWithFiles +
                linkCSSWithFiles + nodeLinkWithFiles
            ]
            declarations.cssFiles = linkCSSWithFiles
            declarations.transforms = transforms
            declarations.usedModules = {}

            global_parser = declarations

            if cache:
                declarations.scope = cache.scope
                declarations.interfaces = cache.interfaces
                declarations.structs = cache.structs
                declarations.hotswap = hotswap
                declarations.allImports = cache.allImports
                declarations.atomTyp = cache.atomTyp
                declarations.hotswap = True
                declarations.usedModules = cache.usedModules

            if former:
                #print("inserting", target)
                ResolveSymbols.insert(former,
                                      declarations,
                                      only=True,
                                      copy=True)
                #print(declarations.scope["_global"])

            declarations.files = files
            declarations.lexed = lexed
            declarations.filenames = filenames
            declarations.opt = opt
            declarations.compiled = {}
            declarations.externFuncs = {"main": []}
            declarations.filenames_sources = filenames_sources
            declarations.global_target = target
            declarations.output_target = target
            declarations.didCompile = False

            if (dev and run):
                clearMain(declarations)

            ResolveSymbols.resolve(declarations)

            #print("declarations")

            #print(declarations.shouldCompile)

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

                parser.files = files
                parser.global_target = target
                parser.output_target = target
                parser.lexed = lexed
                parser.filenames = filenames
                parser.compiled = declarations.compiled
                parser.compiled["main"] = None
                parser.dev = dev

                parsed = parser.parse()

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

                global_parser = parser

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

                if doc:
                    return parser

                canStartWith = ['']

                order_of_modules = []

                for i in parser.compiled:
                    tmp = os.path.dirname(parser.filenames[i][0][0])

                    dir = tmp[tmp.find("packages") + len("packages") +
                              1:tmp.rfind("src") - 1]
                    canStartWith.append(dir)

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

                order_of_modules.append("main")

                for i in parser.lexed:
                    parser.usedModules[i] = datetime.datetime.now()

                _linkCSSWithFiles = [
                    i for (d, i) in linkCSSWithFiles if d in canStartWith
                ]
                _clientLinkWithFiles = [
                    i for (d, i) in clientLinkWithFiles if d in canStartWith
                ]
                _nodeLinkWithFiles = [
                    i for (d, i) in nodeLinkWithFiles if d in canStartWith
                ]
                _linkWithFiles = [
                    i for (d, i) in linkWithFiles if d in canStartWith
                ]

                compiled = order_of_modules  #parser.compiled

                if not dev and not _raise:
                    saveParser.save(parser)

                print("\n======== recompiling =========")
                print("Compilation took : " + str(time() - time1))

                if target == "full":
                    client_linkWithFiles = _linkWithFiles + _clientLinkWithFiles
                    node_linkWithFiles = _linkWithFiles + _nodeLinkWithFiles

                    if run:
                        a = CodeGen.link(compiled,
                                         outputFile,
                                         hotswap=hotswap,
                                         run=False,
                                         debug=debug,
                                         opt=opt,
                                         dev=dev,
                                         linkWithCSS=_linkCSSWithFiles,
                                         linkWith=client_linkWithFiles,
                                         target="client")

                        print("Open website, at", "http://127.0.0.1:3000/")

                        l = CodeGen.link(compiled,
                                         outputFile,
                                         debug=debug,
                                         hotswap=hotswap,
                                         run=run,
                                         opt=opt,
                                         dev=dev,
                                         linkWithCSS=_linkCSSWithFiles,
                                         linkWith=node_linkWithFiles,
                                         target="node")
                    else:
                        l = CodeGen.link(compiled,
                                         outputFile,
                                         debug=debug,
                                         hotswap=hotswap,
                                         run=run,
                                         opt=opt,
                                         dev=dev,
                                         linkWithCSS=_linkCSSWithFiles,
                                         linkWith=node_linkWithFiles,
                                         target="node")
                        a = CodeGen.link(compiled,
                                         outputFile,
                                         hotswap=hotswap,
                                         run=False,
                                         debug=debug,
                                         opt=opt,
                                         dev=dev,
                                         linkWithCSS=_linkCSSWithFiles,
                                         linkWith=client_linkWithFiles,
                                         target="client")

                else:
                    _link_CSSWithFiles = [] if target != "client" else _linkCSSWithFiles
                    _linkWithFiles = _linkWithFiles + _nodeLinkWithFiles if target == "node" else _linkWithFiles + _clientLinkWithFiles if target == "client" else []

                    l = CodeGen.link(compiled,
                                     outputFile,
                                     run=run,
                                     opt=opt,
                                     dev=dev,
                                     hotswap=hotswap,
                                     linkWithCSS=_link_CSSWithFiles,
                                     debug=debug,
                                     linkWith=_linkWithFiles,
                                     target=target)
                didCompile = True

                parser.didCompile = True

                return parser
            elif run:
                if target == "full":
                    print("Open website, at", "http://127.0.0.1:3000/")

                    CodeGen.execNode(outputFile, dev)
                else:
                    if target == "node":
                        CodeGen.execNode(outputFile, dev)
                    else:
                        CodeGen.exec(outputFile)

            return declarations
Esempio n. 6
0
        def compile(target, sources, filenames, former=None):
            global global_parser

            global_parser = cache

            #print(cache.usedModules)

            lexed = Lexer.lex(target, sources, filenames, files, cache, {},
                              tags)

            print("Lexed and parsed : " + str(Lexer.linesOfCode))

            declarations = Parser.Parser(lexed, filenames)
            declarations.hotswap = False
            declarations.shouldCompile = {}
            declarations.atoms = 0
            declarations.atomTyp = False
            declarations.outputFile = outputFile
            declarations.usedModules = {}
            declarations.path = os.path.abspath("")
            declarations.compilingRuntime = compileRuntime

            global_parser = declarations

            if cache:
                declarations.scope = cache.scope
                declarations.interfaces = cache.interfaces
                declarations.structs = cache.structs
                declarations.hotswap = hotswap
                declarations.allImports = cache.allImports
                declarations.atomTyp = cache.atomTyp
                declarations.hotswap = True
                declarations.usedModules = cache.usedModules
                declarations.specifications = cache.specifications
                declarations.includes = cache.includes

                Types.genericTypes = cache.generatedGenericTypes
                Types.inProjectTypes = {
                    name: None
                    for name in Types.genericTypes
                }
                from TopCompiler import Tree
                Tree.casted = cache.casted

                declarations.contextFields = cache.contextFields
                declarations.contextType = {}
                for package in declarations.contextFields:
                    declarations.contextType.update(
                        declarations.contextFields[package])

            if former:
                #print("inserting", target)
                ResolveSymbols.insert(former,
                                      declarations,
                                      only=True,
                                      copy=False)
                #print(declarations.scope["_global"])

            declarations.files = files
            declarations.lexed = lexed
            declarations.filenames = filenames
            declarations.opt = opt
            declarations.compiled = coll.OrderedDict()
            declarations.externFuncs = {"main": []}
            declarations.filenames_sources = filenames_sources
            declarations.global_target = target
            declarations.output_target = target
            declarations.didCompile = False
            declarations.linkWith = linkWith

            if (dev and run):
                clearMain(declarations)

            #print("declarations")

            #print(declarations.shouldCompile)

            declarations.setGlobalData(compileRuntime)
            ResolveSymbols.resolve(declarations)

            if opt == 3 or doc or ImportParser.shouldCompile(
                    False, "main", declarations):
                print("Recompiling")

                parser = Parser.Parser(lexed["main"], filenames["main"])
                parser.package = "main"
                ResolveSymbols.insert(declarations, parser, only=True)

                parser.files = files
                parser.global_target = target
                parser.output_target = target
                parser.lexed = lexed
                parser.filenames = filenames
                parser.compiled = declarations.compiled
                parser.compiled["main"] = None
                parser.contextFields["main"] = {}
                parser.dev = dev
                parser.sc = True

                parsed = parser.parse()

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

                global_parser = parser

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

                if doc:
                    return parser

                canStartWith = ['']

                order_of_modules = []

                compiled = parser.order_of_modules  # order_of_modules #parser.compiled

                typesInContext = []

                for i in parser.compiled:
                    parser.package = i
                    sc = parser.compiled[i][0]
                    if sc or not cache:
                        SimplifyAst.resolveGeneric(parser,
                                                   parser.compiled[i][1][0])

                #generatedTypes = Types.genericTypes
                #Types.genericTypes = {}
                contextCCode = CodeGen.buildContext(parser)
                """ 
                for i in parser.compiled:
                    parser.package = i
                    sc = parser.compiled[i][0]
                    if not parser.compiled[i][0]:
                        if cache and i in cache.generatedTypesPerPackage:
                            parser.generatedTypesPerPackage[i] = cache.generatedTypesPerPackage[i]
                            for typ in cache.generatedTypesPerPackage[i]:
                                Types.genericTypes[typ] = None
                                Types.inProjectTypes[typ] = None
                """

                #print(Types.genericTypes)
                #generatedTypes.update(Types.genericTypes)
                #Types.genericTypes = generatedTypes

                #if not compileRuntime:
                #    addTypes(removedTypes)
                #    contextCCode = CodeGen.buildContext(parser.contextType)

                includes = []

                for i in compiled:
                    tmp = os.path.dirname(parser.filenames[i][0][0])

                    dir = tmp[tmp.find("packages") + len("packages") +
                              1:tmp.rfind("src") - 1]
                    canStartWith.append(dir)

                    sc = parser.compiled[i][0]

                    if sc or not cache:
                        inc = CodeGen.CodeGen(parser,
                                              order_of_modules,
                                              i,
                                              parser.compiled[i][1][0],
                                              parser.compiled[i][1][1],
                                              target,
                                              opt,
                                              debug=debug).compile(opt=opt)
                        includes.extend(inc)
                        parser.includes[i] = inc
                    else:
                        includes.extend(parser.includes[i])

                order_of_modules.append("main")

                for i in parser.lexed:
                    parser.usedModules[i] = datetime.datetime.now()

                _linkWith = [i for (d, i) in linkWith if d in canStartWith]
                _headerIncludePath = [
                    i for (d, i) in headerIncludePath if d in canStartWith
                ]

                parser.generatedGenericTypes = Types.genericTypes
                if compileRuntime:  #not dev and not _raise:
                    deleteQue = []
                    for c in parser.generatedGenericTypes:
                        parser.generatedGenericTypes[c] = None
                        if c in ["_global_Allocator", "_global_Type"]:
                            deleteQue.append(c)

                    for c in deleteQue:
                        del parser.generatedGenericTypes[c]

                timeForCodeAnalysis = time() - beforeLoad

                print("Code Analysis : " + str(timeForCodeAnalysis))

                if False:  #not compileRuntime:
                    c = []

                    for i in compiled:
                        sc = parser.compiled[i][0]
                        if sc:
                            c.append(i)
                        else:
                            header = "lib/" + i + ".h"
                            header = os.path.abspath(header)
                            includes.append('#include "' + header + '"\n')

                    print(includes)

                    prelink = CodeGen.link(
                        c,
                        "recompiled_" + outputFile,
                        to_obj=True,
                        opt=opt,
                        dev=dev,
                        hotswap=hotswap,
                        debug=debug,
                        includes=includes,
                        linkWith=[],
                        headerIncludePath=_headerIncludePath,
                        target=target,
                        context=contextCCode,
                        runtimeBuild=compileRuntime)

                    l = CodeGen.link([],
                                     outputFile,
                                     to_obj=True,
                                     opt=opt,
                                     dev=dev,
                                     hotswap=hotswap,
                                     debug=debug,
                                     includes=includes,
                                     linkWith=[],
                                     headerIncludePath=_headerIncludePath,
                                     target=target,
                                     context=contextCCode,
                                     runtimeBuild=compileRuntime)

                    if not to_obj:
                        l = CodeGen.link([],
                                         outputFile,
                                         to_obj=to_obj,
                                         opt=opt,
                                         dev=dev,
                                         hotswap=hotswap,
                                         debug=debug,
                                         includes=includes,
                                         linkWith=_linkWith + [
                                             outputFile + ".o",
                                             "recompiled_" + outputFile + ".o"
                                         ],
                                         headerIncludePath=_headerIncludePath,
                                         target=target,
                                         context=contextCCode,
                                         runtimeBuild=compileRuntime)
                else:
                    l = CodeGen.link(compiled,
                                     outputFile,
                                     to_obj=to_obj,
                                     opt=opt,
                                     dev=dev,
                                     hotswap=hotswap,
                                     debug=debug,
                                     includes=includes,
                                     linkWith=_linkWith,
                                     headerIncludePath=_headerIncludePath,
                                     target=target,
                                     context=contextCCode,
                                     runtimeBuild=compileRuntime)
                if compileRuntime:
                    saveParser.save(parser, compileRuntime)

                print("\n======== recompiling =========")
                print("Compilation took : " + str(time() - time1))
                print("")

                if run:
                    if to_obj:
                        Error.error("Cannot run .obj")
                    CodeGen.exec(outputFile)

                didCompile = True

                parser.didCompile = True
                return parser
            elif run:
                CodeGen.exec(outputFile)

            return declarations
Esempio n. 7
0
def _resolve(self, tokens, filename, passN=0):
    target = self.global_target
    if self.package != "main":
        self.global_target = "full"

    if self.hotswap and not ImportParser.shouldCompile(False, self.package,
                                                       self):
        return

    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 == "from":
                ImportParser.fromParser(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 == "from":
                ImportParser.fromParser(self, True)
            elif b == "type":
                Parser.addBookmark(self)
                Struct.typeParser(self, decl=True)
                Parser.returnBookmark(self)

        elif passN == 0:
            if b == "type":
                name = self.nextToken().token
                if name == "ext":
                    name = self.nextToken().token

                ofType = None
                gen = {}

                if self.nextToken().token == "[":
                    Scope.incrScope(self)
                    gen = FuncParser.generics(self, name)
                    Scope.decrScope(self)
                    ofType = self.thisToken().token
                else:
                    ofType = self.thisToken().token

                Scope.addVar(Tree.Node(self), self, name,
                             Scope.Type(True, Types.StructInit(name)))

                if ofType is None or ofType == "=":
                    #"""
                    self.structs[self.package][name] = Struct.Struct(
                        name, [], [], gen, self, self.package)
                    self.structs[self.package][name].methods = {}
                    #"""
                elif ofType == "either":
                    self.interfaces[self.package][name] = Types.Enum(
                        self.package, name, coll.OrderedDict(), gen)
                elif ofType == "with":
                    self.interfaces[self.package][name] = Types.Interface(
                        False, {}, name=self.package + "." + name)
                elif ofType == "is":
                    self.interfaces[self.package][name] = Types.Alias(
                        self.package, name, Types.Null(), gen)

        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

    self.global_target = target
Esempio n. 8
0
        def compile(target, sources, filenames, former=None):
            lexed = Lexer.lex(sources, filenames)

            declarations = Parser.Parser(lexed, filenames)
            declarations.hotswap = False
            declarations.shouldCompile = {}
            declarations.atoms = 0
            declarations.atomTyp = False
            declarations.jsFiles = clientLinkWithFiles + linkWithFiles

            if cache:
                declarations.scope = cache.scope
                declarations.interfaces = cache.interfaces
                declarations.structs = cache.structs
                declarations.hotswap = hotswap
                declarations.allImports = cache.allImports
                declarations.atomTyp = cache.atomTyp

            if former:
                #print("inserting", target)
                ResolveSymbols.insert(former,
                                      declarations,
                                      only=True,
                                      copy=True)
                #print(declarations.scope["_global"])

            declarations.files = files
            declarations.lexed = lexed
            declarations.filenames = filenames
            declarations.opt = opt
            declarations.compiled = {}
            declarations.externFuncs = {"main": []}
            declarations.filenames_sources = filenames_sources
            declarations.global_target = target

            ResolveSymbols.resolve(declarations)

            #print("declarations")

            #print(declarations.shouldCompile)

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

                parser.files = files
                parser.global_target = target
                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],
                                        target).compile(opt=opt)

                if target == "full":
                    _linkCSSWithFiles = linkCSSWithFiles
                    client_linkWithFiles = linkWithFiles + clientLinkWithFiles
                    node_linkWithFiles = linkWithFiles + nodeLinkWithFiles

                    a = CodeGen.link(parser.compiled,
                                     outputFile,
                                     hotswap=hotswap,
                                     run=False,
                                     opt=opt,
                                     dev=dev,
                                     linkWithCSS=_linkCSSWithFiles,
                                     linkWith=client_linkWithFiles,
                                     target="client")

                    if run:
                        import webbrowser
                        webbrowser.open("http://127.0.0.1:3000/")

                    l = CodeGen.link(parser.compiled,
                                     outputFile,
                                     hotswap=hotswap,
                                     run=run,
                                     opt=opt,
                                     dev=dev,
                                     linkWithCSS=_linkCSSWithFiles,
                                     linkWith=node_linkWithFiles,
                                     target="node")

                else:
                    _linkCSSWithFiles = [] if target != "client" else linkCSSWithFiles
                    _linkWithFiles = linkWithFiles + nodeLinkWithFiles if target == "node" else linkWithFiles + clientLinkWithFiles if target == "client" else []

                    l = CodeGen.link(parser.compiled,
                                     outputFile,
                                     run=run,
                                     opt=opt,
                                     dev=dev,
                                     hotswap=hotswap,
                                     linkWithCSS=_linkCSSWithFiles,
                                     linkWith=_linkWithFiles,
                                     target=target)
                didCompile = True
                print("\n======== recompiling =========")
                return parser
            elif run:
                if target == "full":
                    if run:
                        import webbrowser
                        webbrowser.open("http://127.0.0.1:3000/")

                    CodeGen.execNode(outputFile, dev)
                else:
                    CodeGen.exec(outputFile)

            return declarations