예제 #1
0
 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
예제 #2
0
 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
예제 #3
0
 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)
예제 #4
0
    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)
예제 #5
0
    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