Exemple #1
0
    def test_analyze_entire_ast(self):

        # Arrange:
        code = "LD VA, #02\nLD VB, #02\n"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)

        # Act:
        # Arrange:
        self.assertTrue(semantic.analyze(ast))
Exemple #2
0
    def test_throws_syntactic_error_when_initialize_with_has_error_value(self):

        # Arrange:
        code = "V0, V1"
        tokens = lexical.tokenize(code)

        # Act:
        syntactic.Ast(tokens)

        # Assert:
        self.assertTrue(logger.has_error)
Exemple #3
0
    def test_throws_syntactic_error_when_sequence_is_has_error(self):

        # Arrange:
        code = "LD ,"
        tokens = lexical.tokenize(code)

        # Act:
        syntactic.Ast(tokens)

        # Assert:
        self.assertTrue(logger.has_error)
Exemple #4
0
    def test_should_generate_simple_ast(self):

        # Arrange:
        code = "LD VA, 0x02\n"
        tokens = lexical.tokenize(code)

        # Act:
        ast = syntactic.Ast(tokens)

        # Assert:
        self.assertTrue(len(ast.nodes) > 0)
Exemple #5
0
    def test_construct_symbolic_table_in_ast(self):

        # Arrange:
        code = "Draw:\n   DRW V0, V1, 0x1\nPlay:    LD, V0, 0x40\n    LD DT, V0"
        tokens = lexical.tokenize(code)

        # Act:
        ast = syntactic.Ast(tokens)

        # Assert:
        self.assertEquals(len(ast.symbols), 2)
Exemple #6
0
    def test_log_when_repeat_symbol(self):

        # Arrange:
        code = "Draw:\n   DRW V0, V1, 0x1\nDraw:    LD, V0, 0x40\n    LD DT, V0"
        tokens = lexical.tokenize(code)

        # Act:
        syntactic.Ast(tokens)

        # Assert:
        self.assertTrue(logger.has_error)
Exemple #7
0
    def test_validate_if_name_exists_in_symbol_table(self):

        # Arrange:
        code = "Play: LD VA, 2\nJP Args\nArgs: DRW V0, V1, 1"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)

        # Act:
        semantic.analyze(ast)

        # Arrange:
        self.assertFalse(logger.has_error)
Exemple #8
0
    def test_has_error_analyze_entire_ast(self):

        # Arrange:
        code = "LD VA, Play\nJP 409\n"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)

        # Act:
        semantic.analyze(ast)

        # Arrange:
        self.assertTrue(logger.has_error)
Exemple #9
0
    def test_throw_exception_when_validate_if_name_does_not_exists_in_symbol_table(
            self):

        # Arrange:
        code = "Play: LD VA, 2\nJP Draw\nArgs: DRW V0, V1, 1"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)

        # Act:
        semantic.analyze(ast)

        # Arrange:
        self.assertTrue(logger.has_error)
Exemple #10
0
    def test_convert_SE_3XNN_node_to_opcode(self):

        # Arrange:
        code = "SE V0, 255"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)
        semantic.analyze(ast)

        # Act:
        opcodes = assembler.generate(ast)

        # Arrange:
        self.assertEqual(self.pack('30FF'), opcodes[0])
Exemple #11
0
    def test_should_padding_when_value_should_node_complete_opcode(self):

        # Arrange:
        code = "JP 2"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)
        semantic.analyze(ast)

        # Act:
        opcodes = assembler.generate(ast)

        # Arrange:
        self.assertEqual(self.pack('1002'), opcodes[0])
Exemple #12
0
    def test_convert_JMP_BNNN_node_to_opcode(self):

        # Arrange:
        code = "JP 4095, V0"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)
        semantic.analyze(ast)

        # Act:
        opcodes = assembler.generate(ast)

        # Arrange:
        self.assertEqual(self.pack('BFFF'), opcodes[0])
Exemple #13
0
    def test_convert_LD_FX33_node_to_opcode(self):

        # Arrange:
        code = "LD B, V6"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)
        semantic.analyze(ast)

        # Act:
        opcodes = assembler.generate(ast)

        # Arrange:
        self.assertEqual(self.pack('F633'), opcodes[0])
Exemple #14
0
    def test_convert_DW_to_opcode(self):

        # Arrange:
        code = "DW #F000"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)
        semantic.analyze(ast)

        # Act:
        opcodes = assembler.generate(ast)

        # Arrange:
        self.assertEqual(self.pack('F000'), opcodes[0])
Exemple #15
0
    def test_convert_DRW_node_to_opcode(self):

        # Arrange:
        code = "DRW V1, V9, #F"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)
        semantic.analyze(ast)

        # Act:
        opcodes = assembler.generate(ast)

        # Arrange:
        self.assertEqual(self.pack('D19F'), opcodes[0])
Exemple #16
0
    def test_convert_SHL_node_to_opcode(self):

        # Arrange:
        code = "SHL V3, V4"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)
        semantic.analyze(ast)

        # Act:
        opcodes = assembler.generate(ast)

        # Arrange:
        self.assertEqual(self.pack('834E'), opcodes[0])
Exemple #17
0
    def test_convert_ADD_8XY4_node_to_opcode(self):

        # Arrange:
        code = "ADD V2, V6"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)
        semantic.analyze(ast)

        # Act:
        opcodes = assembler.generate(ast)

        # Arrange:
        self.assertEqual(self.pack('8264'), opcodes[0])
Exemple #18
0
    def test_convert_SNE_9XY0_node_to_opcode(self):

        # Arrange:
        code = "SNE V1, V5"
        tokens = lexical.tokenize(code)
        ast = syntactic.Ast(tokens)
        semantic.analyze(ast)

        # Act:
        opcodes = assembler.generate(ast)

        # Arrange:
        self.assertEqual(self.pack('9150'), opcodes[0])
Exemple #19
0
def exec_compile(args):
    import sys

    code = args.filename.read()
    tokens = lexical.tokenize(code)
    ast = syntactic.Ast(tokens)
    semantic.analyze(ast)

    logger.show()
    if logger.has_error:
        sys.exit(-1)

    opcodes = assembler.generate(ast)

    for opcode in opcodes:
        args.output.write(opcode)
    args.output.close()
Exemple #20
0
    def test_should_group_commands_in_ast(self):

        # Arrange:
        node = []
        node.append({
            'class': 'T_COMMAND',
            'lexeme': 'LD',
            'column': 1,
            'line': 1
        })
        node.append({
            'class': 'T_REGISTER',
            'lexeme': 'VA',
            'column': 4,
            'line': 1
        })
        node.append({
            'class': 'T_COMMA',
            'lexeme': ',',
            'column': 6,
            'line': 1
        })
        node.append({
            'class': 'T_NUMBER',
            'lexeme': '0x2',
            'column': 8,
            'line': 1
        })
        code = "LD VA, 2\n"
        tokens = lexical.tokenize(code)

        # Act:
        ast = syntactic.Ast(tokens)

        # Assert:
        self.assertEquals(node, ast.nodes[0x202])