Exemplo n.º 1
0
    def include(self, file_name):
        s = mshl.find_include_file(file_name)

        if not s:
            mshl.error(
                'cannot include {}: no such file exists'.format(file_name))
            return

        if s in self.includes:
            return

        self.includes.append(s)

        # FIXME: This crap needs to be cleaned up and moved into some other
        # function in another file.
        with open(s, 'r') as f:
            source = StringSource(f.read())

        lexer = Lexer(source)
        parser = Parser(lexer)

        #mshl.trace('generating syntax tree...')
        tree = parser.generate_ast()

        old_srcfile = mshl.srcfile
        mshl.srcfile = file_name
        self.verify_internal(tree)
        mshl.srcfile = old_srcfile
def parse_file(s):
    with open(s, 'r') as f:
        source = StringSource(f.read())

    lexer = Lexer(source)
    parser = Parser(lexer)

    tree = parser.generate_ast()

    if mshl.num_errors > 0:
        mshl.fatal('there were errors')

    analyzer = SemanticAnalyzer()
    analyzer.verify(tree)

    if not mshl.conf.flag('--no-optim'):
        optim = ASTOptimizer()
        optim.optimize_ast(tree)

    if mshl.num_errors > 0:
        mshl.fatal('there were errors')

    return tree
Exemplo n.º 3
0
    def include(self, file_name):
        # TODO: Provide some general compilation function so we can reuse flags here
        s = mshl.find_include_file(file_name)

        if s in self.includes:
            return

        f = open(s)
        s = f.read()
        f.close()

        p = Parser(Lexer(StringSource(s)))
        ast = p.generate_ast()
        b = Batch(ast)
        b.scope = self.scope
        b.tempvar_counter = self.tempvar_counter
        b.label_counter = self.label_counter
        b.generate_code()
        self.tempvar_counter = b.tempvar_counter
        self.label_counter = b.label_counter

        #top_scope = self.scope
        #while top_scope.parent_scope:
        #    top_scope = top_scope.parent_scope

        #for varname, var in b.scope.variables.iteritems():
        #    self.decl_var(varname, var.type_)

        self.emit(b.segments['init'], 'init')
        self.emit(b.segments['decl'], 'decl')
        self.emit(b.segments['code'], 'code')

        # Don't kill the stack.
        self.push('include', STR)

        self.includes.append(s)