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