def test_decr_withlabel(): code = "decr mylabel" with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[0]) == parser.DecrOp assert ast[0].label_name == "mylabel"
def test_assign_from_tile(): code = "emp = 3" with StringIO(code) as f: ast = parser.parse_it(f) assert ast[0].src == "3" assert ast[0].dst == "emp"
def test_assign_to_addressof_tilenumber(): code = "*3 = emp" with StringIO(code) as f: ast = parser.parse_it(f) assert ast[0].src == "emp" assert ast[0].dst == parser.AddressOf("3")
def test_assign_to_tilenumber(): code = "3 = emp" with StringIO(code) as f: ast = parser.parse_it(f) assert ast[0].src == "emp" assert ast[0].dst == "3"
def test_compat_inbox(): code = "inbox" with StringIO(code) as f: ast = parser.parse_it(f) assert ast[0].src == "inbox" assert ast[0].dst == "emp"
def test_assign_from_alias(): code = "emp = myTile" with StringIO(code) as f: ast = parser.parse_it(f) assert ast[0].src == "myTile" assert ast[0].dst == "emp"
def test_assign_from_addressof_alias(): code = "emp = *myTile" with StringIO(code) as f: ast = parser.parse_it(f) assert ast[0].src == parser.AddressOf("myTile") assert ast[0].dst == "emp"
def test_assign_from_addressof_tile(): code = "emp = *3" with StringIO(code) as f: ast = parser.parse_it(f) assert ast[0].src == parser.AddressOf("3") assert ast[0].dst == "emp"
def test_aliases(): code = "alias 5 test" with StringIO(code) as f: ast = parser.parse_it(f) assert ast[0].symbolic_name == "test" assert ast[0].tile_no == 5
def test_decr_withnumber_address(): code = "decr *4" with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[0]) == parser.DecrOp assert ast[0].label_name == parser.AddressOf("4")
def test_compat_decr_withnumber(): code = "bump- 0" with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[0]) == parser.DecrOp assert ast[0].label_name == "0"
def test_incr_withnumber(): code = "bump+ 0" with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[0]) == parser.IncrOp assert ast[0].label_name == "0"
def test_compat_incr_withlabel(): code = "bump+ mylabel" with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[0]) == parser.IncrOp assert ast[0].label_name == "mylabel"
def test_incr_withlabel_address(): code = "incr *mylabel" with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[0]) == parser.IncrOp assert ast[0].label_name == parser.AddressOf("mylabel")
def test_compat_copyfrom_tilenumber(): code = "copyfrom 0" with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[0]) == parser.AssignOp assert ast[0].src == "0" assert ast[0].dst == "emp"
def test_compat_copyto_addressof_tilenumber(): code = "copyto [0]" with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[0]) == parser.AssignOp assert ast[0].src == "emp" assert ast[0].dst == parser.AddressOf("0")
def test_compat_copyto_addressof_aliased(): code = "copyto *aliased" with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[0]) == parser.AssignOp assert ast[0].src == "emp" assert ast[0].dst == parser.AddressOf("aliased")
def test_compat_copyfrom_aliased(): code = "copyfrom aliased" with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[0]) == parser.AssignOp assert ast[0].src == "aliased" assert ast[0].dst == "emp"
def test_jump_to_undefined_label_condjmp(): code = """ notwhatyouwant: jez whatiwant """ with StringIO(code) as f: ast = parser.parse_it(f) with pytest.raises(ValueError): semantic_check.check_undefined_label_jump(ast)
def test_singlelabel(): code = """ test: jmp test """ with StringIO(code) as f: ast = parser.parse_it(f) assert semantic_check.check_multiple_labels(ast) assert semantic_check.check_undefined_label_jump(ast)
def test_if_noelse(): code = """ if ez then outbox endif """ with StringIO(code) as f: ast = parser.parse_it(f) if_op = ast[0] assert if_op.false_branch == []
def test_if_nz(): code = """ if nz then outbox endif """ with StringIO(code) as f: ast = parser.parse_it(f) if_op = ast[0] assert type(if_op) == parser.IfOp assert if_op.condition == "nz"
def test_double_defined_label(): code = """ test: test: jmp test """ with StringIO(code) as f: ast = parser.parse_it(f) with pytest.raises(ValueError): semantic_check.check_multiple_labels(ast) assert semantic_check.check_undefined_label_jump(ast)
def test_if_single_op(): code = """ emp = inbox if ez then emp = inbox endif """ with StringIO(code) as f: ast = parser.parse_it(f) assert type(ast[1]) == parser.IfOp assert ast[1].condition == "ez" assert ast[1].true_branch == [parser.AssignOp("inbox", "emp")]
def test_if_nested(): code = """ if ez then if nz then endif endif """ with StringIO(code) as f: ast = parser.parse_it(f) if_op = ast[0] nested_if = if_op.true_branch[0] assert if_op.condition == "ez" assert nested_if.condition == "nz" assert nested_if.true_branch == nested_if.false_branch assert if_op.false_branch == []
def test_if_multiple_ops(): code = """ start: emp = inbox if ez then outbox jmp start endif """ with StringIO(code) as f: ast = parser.parse_it(f) if_op = ast[2] assert type(if_op) == parser.IfOp assert if_op.condition == "ez" assert if_op.true_branch == [parser.OutboxOp(), parser.JumpOp("start")]
def calculate_optimized_ast(fhandle, args): result_ast = p.parse_it(fhandle) checker.perform_label_checks(result_ast) checker.perform_variable_checks(result_ast) result_ast = conversion.convert_ifnz_to_ifez(result_ast) result_ast = conversion.convert_iftojump(result_ast) if not args.no_jump_compression: result_ast = conversion.compress_jumps(result_ast) if not args.no_unreachable: result_ast = conversion.remove_unreachable_code(result_ast) if not args.no_jmp_then_label: unchanged = False while not unchanged: new_ast = conversion.fix_jmp_then_label(result_ast) unchanged = new_ast == result_ast result_ast = new_ast return result_ast
def test_assign_to_outbox(): code = "outbox = emp" with StringIO(code) as f: with pytest.raises(ValueError): ast = parser.parse_it(f)
def test_compat_copyto_emp(): code = "copyto emp" with StringIO(code) as f: with pytest.raises(ValueError): parser.parse_it(f)
def test_assign_from_outbox(): code = "emp = outbox" with StringIO(code) as f: with pytest.raises(ValueError): ast = parser.parse_it(f)