def optimize(self, code, expected): tokenizer1 = Tokenizer() tokenizer2 = Tokenizer() tokens1 = tokenizer1.tokenize('var i = ' + code) tokens2 = tokenizer2.tokenize('var i = ' + expected) parser1 = Parser() parser2 = Parser() ast1 = parser1.parse(tokens1) ast2 = parser2.parse(tokens2) optimizer = Optimizer() optimizer.optimize(ast1) self.assertEqual(ast1, ast2)
def parse_exp7(lexer): exp = ExpParser.parse_exp6(lexer) while lexer.look_ahead() == TokenKind.OP_BAND: line, op, _ = lexer.get_next_token() bor = lua_exp.BinopExp(line, op, exp, ExpParser.parse_exp8(lexer)) exp = Optimizer.optimize_bitwise_binary_op(bor) return exp
def parse_exp11(lexer): exp = ExpParser.parse_exp10(lexer) while lexer.look_ahead() == TokenKind.OP_AND: line, op, _ = lexer.get_next_token() lor = lua_exp.BinopExp(line, op, exp, ExpParser.parse_exp10(lexer)) exp = Optimizer.optimize_logical_and(lor) return exp
def parse_exp6(lexer): exp = ExpParser.parse_exp5(lexer) if lexer.look_ahead() in (TokenKind.OP_SHL, TokenKind.OP_SHR): line, op, _ = lexer.get_next_token() shx = lua_exp.BinopExp(line, op, exp, ExpParser.parse_exp5(lexer)) exp = Optimizer.optimize_bitwise_binary_op(shx) else: return exp return exp
def parse_exp3(lexer): exp = ExpParser.parse_exp2(lexer) while True: if lexer.look_ahead() in (TokenKind.OP_MUL, TokenKind.OP_MOD, TokenKind.OP_DIV, TokenKind.OP_IDIV): line, op, _ = lexer.get_next_token() arith = lua_exp.BinopExp(line, op, exp, ExpParser.parse_exp2(lexer)) exp = Optimizer.optimize_arith_binary_op(arith) else: break return exp
def parse_exp1(lexer): exp = ExpParser.parse_exp0(lexer) if lexer.look_ahead() == TokenKind.OP_POW: line, op, _ = lexer.get_next_token() exp = lua_exp.BinopExp(line, op, exp, ExpParser.parse_exp2(lexer)) return Optimizer.optimize_pow(exp)
def parse_exp2(lexer): if lexer.look_ahead() in (TokenKind.OP_UNM, TokenKind.OP_BNOT, TokenKind.OP_LEN, TokenKind.OP_NOT): line, op, _ = lexer.get_next_token() exp = lua_exp.UnopExp(line, op, ExpParser.parse_exp2(lexer)) return Optimizer.optimize_unary_op(exp) return ExpParser.parse_exp1(lexer)
print """ parser = Parser() ast = parser.parse(tokens) """ for a in ast: print a """ """ interpreter = Interpreter() interpreter.interpret(ast) """ optimizer = Optimizer() optimizer.optimize(ast) code_generator = CodeGenerator() code = code_generator.generate(ast) f = open('out.asm', 'w') f.write(code) f.close() os.system('nasm -f elf64 out.asm -o out.o') os.system('gcc out.o -o out') os.system('./out')