예제 #1
0
 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)
예제 #2
0
 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
예제 #3
0
 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
예제 #4
0
 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
예제 #5
0
 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
예제 #6
0
 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)
예제 #7
0
 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)
예제 #8
0
파일: main.py 프로젝트: fotcorn/compiler
    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')