def optimize_bitwise_binary_op(exp): i, oki = Optimizer.cast_to_int(exp.exp1) j, okj = Optimizer.cast_to_int(exp.exp2) if oki and okj: if exp.op == TokenKind.OP_BAND: return lua_exp.IntegerExp(exp.line, i & j) if exp.op == TokenKind.OP_BOR: return lua_exp.IntegerExp(exp.line, i | j) if exp.op == TokenKind.OP_BXOR: return lua_exp.IntegerExp(exp.line, i ^ j) if exp.op == TokenKind.OP_SHL: return lua_exp.IntegerExp(exp.line, i << j) if exp.op == TokenKind.OP_SHR: return lua_exp.IntegerExp(exp.line, i >> j) return exp
def optimize_bnot(exp): if isinstance(exp.exp, lua_exp.IntegerExp): exp.exp.val = ~exp.exp.val return exp.exp.val if isinstance(exp.exp, lua_exp.FloatExp): i = LuaValue.float2integer(exp.exp.val) if i is not None: return lua_exp.IntegerExp(exp.exp.line, ~i) return exp
def parse_number_exp(lexer): line, _, token = lexer.get_next_token() i = LuaValue.parse_integer(token) if i is not None: return lua_exp.IntegerExp(line, i) f = LuaValue.parse_float(token) if f is not None: return lua_exp.FloatExp(line, f) raise Exception('not a number: ' + token)
def finish_for_num_stat(lexer, line_of_for, var_name): lexer.get_next_token_of_kind(TokenKind.OP_ASSIGN) init_exp = ExpParser.parse_exp(lexer) lexer.get_next_token_of_kind(TokenKind.SEP_COMMA) limit_exp = ExpParser.parse_exp(lexer) if lexer.look_ahead() == TokenKind.SEP_COMMA: lexer.get_next_token() step_exp = ExpParser.parse_exp(lexer) else: step_exp = lua_exp.IntegerExp(lexer.get_line(), 1) line_of_do, _ = lexer.get_next_token_of_kind(TokenKind.KW_DO) block = Parser.parse_block(lexer) lexer.get_next_token_of_kind(TokenKind.KW_END) return lua_stat.ForNumStat(line_of_for, line_of_do, var_name, init_exp, limit_exp, step_exp, block)
def optimize_arith_binary_op(exp): if isinstance(exp.exp1, lua_exp.IntegerExp): if isinstance(exp.exp2, lua_exp.IntegerExp): if exp.op == TokenKind.OP_ADD: return lua_exp.IntegerExp(exp.line, exp.exp1.val + exp.exp2.val) if exp.op == TokenKind.OP_SUB: return lua_exp.IntegerExp(exp.line, exp.exp1.val - exp.exp2.val) if exp.op == TokenKind.OP_MUL: return lua_exp.IntegerExp(exp.line, exp.exp1.val * exp.exp2.val) if exp.op == TokenKind.OP_IDIV: if exp.exp2.val != 0: return lua_exp.IntegerExp(exp.line, exp.exp1.val // exp.exp2.val) if exp.op == TokenKind.OP_MOD: if exp.exp2.val != 0: return lua_exp.IntegerExp(exp.line, exp.exp1.val % exp.exp2.val) f, okf = Optimizer.cast_to_float(exp.exp1) g, okg = Optimizer.cast_to_float(exp.exp2) if okf and okg: if exp.op == TokenKind.OP_ADD: return lua_exp.IntegerExp(exp.line, f + g) if exp.op == TokenKind.OP_SUB: return lua_exp.IntegerExp(exp.line, f - g) if exp.op == TokenKind.OP_MUL: return lua_exp.IntegerExp(exp.line, f * g) if exp.op == TokenKind.OP_DIV: if g != 0: return lua_exp.IntegerExp(exp.line, f / g) if exp.op == TokenKind.OP_IDIV: if g != 0: return lua_exp.IntegerExp(exp.line, f // g) if exp.op == TokenKind.OP_MOD: if g != 0: return lua_exp.IntegerExp(exp.line, f % g) if exp.op == TokenKind.OP_POW: return lua_exp.IntegerExp(exp.line, f**g) return exp