Example #1
0
    def test_array_initializer_no_errors(self):
        tokens_list = [
            Token("assignment", "", 1),
            Token("left_brace", "", 1),
            Token("number", 1, 1),
            Token("comma", "", 1),
            Token("number", 2, 1),
            Token("right_brace", "", 1),
        ]
        table = SymbolTable()
        table.entry("1", "int", "variable")
        table.entry("2", "int", "variable")

        op_value, op_type, i = array_initializer(
            tokens=tokens_list,
            i=1,
            table=table,
            size_of_array=2,
            msg="Test message",
            func_ret_type={},
        )

        self.assertEqual(op_value, "{1,2")
        self.assertEqual(op_type, 3)
Example #2
0
    def test_switch_statement_missing_right_paren(self):
        tokens_list = [
            Token("switch", "", 1),
            Token("left_paren", "", 1),
            Token("print", "", 1),
        ]
        table = SymbolTable()

        self.__suppress_print()

        with self.assertRaises(SystemExit):
            _, _, _ = switch_statement(
                tokens=tokens_list, i=1, table=table, func_ret_type={}
            )

        self.__release_print()
Example #3
0
    def __test_error_case(self, tokens_list, table=None):
        if table == None:
            table = SymbolTable()

        self.__suppress_print()

        with self.assertRaises(SystemExit):
            _, _, _ = array_initializer(
                tokens=tokens_list,
                i=1,
                table=table,
                size_of_array=2,
                msg="Test message",
            )

        self.__release_print()
    def test_lexical_analyze_left_right_paren_call_end(self):
        # Test left_paren, right_paren, and call_end

        source_code = "var a = (1)"
        with open("testing.simc", "w") as file:
            file.write(source_code)

        table = SymbolTable()

        tokens = lexical_analyze("testing.simc", table)

        left_paren = Token("left_paren", "", 1)
        right_paren = Token("right_paren", "", 1)
        call_end = Token("call_end", "", 1)

        self.assertEqual(tokens[3], left_paren)
        self.assertEqual(tokens[5], right_paren)
    def test_lexical_analyze_assignment_equal(self):
        # Test assignment and equal

        source_code = "var a = 1 == 1"

        with open("testing.simc", "w") as file:
            file.write(source_code)

        table = SymbolTable()

        tokens = lexical_analyze("testing.simc", table)

        assignment = Token("assignment", "", 1)
        equal = Token("equal", "", 1)

        self.assertEqual(tokens[2], assignment)
        self.assertEqual(tokens[-2], equal)
    def test_lexical_analyze_multiply_equal_multiply(self):
        # Test multiply_equal and multiply

        source_code = """var a = 1 * 2
        a *= 1
        """

        with open("testing.simc", "w") as file:
            file.write(source_code)

        table = SymbolTable()

        tokens = lexical_analyze("testing.simc", table)

        multiply_equal = Token("multiply_equal", "", 2)
        multiply = Token("multiply", "", 1)

        self.assertEqual(tokens[8], multiply_equal)
        self.assertEqual(tokens[4], multiply)
    def test_lexical_analyze_modulus_equal_modulus(self):
        # Test modulus_equal and modulus

        source_code = """var a = 1 % 2
        a %= 3
        """

        with open("testing.simc", "w") as file:
            file.write(source_code)

        table = SymbolTable()

        tokens = lexical_analyze("testing.simc", table)

        modulus_equal = Token("modulus_equal", "", 2)
        modulus = Token("modulus", "", 1)

        self.assertEqual(tokens[8], modulus_equal)
        self.assertEqual(tokens[4], modulus)
Example #8
0
    def test_array_initializer_cannot_find_type(self):
        tokens_list = [
            Token("assignment", "", 1),
            Token("left_brace", "", 1),
            Token("number", 1, 1),
            Token("comma", "", 1),
            Token("number", 2, 1),
            Token("right_brace", "", 1),
        ]
        table = SymbolTable()
        table.entry("1", "var", "variable")
        table.entry("3.14", "var", "variable")

        self.__test_error_case(tokens_list, table)
    def test_lexical_analyze_left_right_brace_newline(self):
        # Test left_brace, right_brace, and newline

        source_code = """if(1 == 1) {
          print(1)
        }
        """
        with open("testing.simc", "w") as file:
            file.write(source_code)

        table = SymbolTable()

        tokens = lexical_analyze("testing.simc", table)

        left_brace = Token("left_brace", "", 1)
        right_brace = Token("right_brace", "", 3)
        newline = Token("newline", "", 1)

        self.assertEqual(tokens[7], left_brace)
        self.assertEqual(tokens[-2], right_brace)
        self.assertEqual(tokens[8], newline)
Example #10
0
    def test_for_statement_missing_by_keyword(self):
        tokens_list = [
            Token("for", "", 1),
            Token("id", 1, 1),
            Token("in", "", 1),
            Token("number", 2, 1),
            Token("to", "", 1),
            Token("number", 3, 1),
            Token("print", "", 1),
        ]
        table = SymbolTable()
        table.entry("a", "int", "variable")
        table.entry("1", "int", "variable")
        table.entry("10", "int", "variable")

        self.__test_error_case(tokens_list, table=table)
    def test_lexical_analyze_minus_equal_decrement_minus(self):
        # Test minus_equal, decrement, and minus

        source_code = """var a = 1 - 2
        a -= 1
        a--
        """

        with open("testing.simc", "w") as file:
            file.write(source_code)

        table = SymbolTable()

        tokens = lexical_analyze("testing.simc", table)

        minus_equal = Token("minus_equal", "", 2)
        decrement = Token("decrement", "", 3)
        minus = Token("minus", "", 1)

        self.assertEqual(tokens[8], minus_equal)
        self.assertEqual(tokens[12], decrement)
        self.assertEqual(tokens[4], minus)
    def test_lexical_analyze_less_than_less_than_equal_left_shift(self):
        # Test less_than, less_than_equal, left_shift

        source_code = """1 < 2
        1 <= 2
        1 << 2
        """

        with open("testing.simc", "w") as file:
            file.write(source_code)

        table = SymbolTable()

        tokens = lexical_analyze("testing.simc", table)

        less_than = Token("less_than", "", 1)
        less_than_equal = Token("less_than_equal", "", 2)
        left_shift = Token("left_shift", "", 3)

        self.assertEqual(tokens[1], less_than)
        self.assertEqual(tokens[5], less_than_equal)
        self.assertEqual(tokens[9], left_shift)
    def test_lexical_analyze_greater_than_greater_than_equal_right_shift(self):
        # Test greater_than, greater_than_equal, right_shift

        source_code = """1 > 2
        1 >= 2
        1 >> 2
        """

        with open("testing.simc", "w") as file:
            file.write(source_code)

        table = SymbolTable()

        tokens = lexical_analyze("testing.simc", table)

        greater_than = Token("greater_than", "", 1)
        greater_than_equal = Token("greater_than_equal", "", 2)
        right_shift = Token("right_shift", "", 3)

        self.assertEqual(tokens[1], greater_than)
        self.assertEqual(tokens[5], greater_than_equal)
        self.assertEqual(tokens[9], right_shift)
    def test_lexical_analyze_plus_equal_increment_plus(self):
        # Test plus_equal, increment, and plus

        source_code = """var a = 1 + 2
        a += 1
        a++
        """

        with open("testing.simc", "w") as file:
            file.write(source_code)

        table = SymbolTable()

        tokens = lexical_analyze("testing.simc", table)

        plus_equal = Token("plus_equal", "", 2)
        increment = Token("increment", "", 3)
        plus = Token("plus", "", 1)

        self.assertEqual(tokens[8], plus_equal)
        self.assertEqual(tokens[12], increment)
        self.assertEqual(tokens[4], plus)
Example #15
0
    def test_for_statement_no_errors(self):
        tokens_list = [
            Token("for", "", 1),
            Token("id", 1, 1),
            Token("in", "", 1),
            Token("number", 2, 1),
            Token("to", "", 1),
            Token("number", 3, 1),
            Token("by", "", 1),
            Token("plus", "", 1),
            Token("number", 4, 1),
        ]
        table = SymbolTable()
        table.entry("a", "int", "variable")
        table.entry("1", "int", "variable")
        table.entry("10", "int", "variable")
        table.entry("2", "int", "variable")

        opcode, _, _ = for_statement(tokens=tokens_list,
                                     i=1,
                                     table=table,
                                     func_ret_type={})

        self.assertEqual(opcode, OpCode("for", "a&&&1&&&10&&&+&&&<&&&2", None))
Example #16
0
    def test_array_initializer_number_of_entries_do_not_match(self):
        tokens_list = [
            Token("assignment", "", 1),
            Token("left_brace", "", 1),
            Token("number", 1, 1),
            Token("comma", "", 1),
            Token("number", 2, 1),
            Token("comma", "", 1),
            Token("number", 2, 1),
            Token("right_brace", "", 1),
        ]
        table = SymbolTable()
        table.entry("1", "int", "variable")
        table.entry("3", "int", "variable")
        table.entry("4", "int", "variable")

        self.__test_error_case(tokens_list, table)
Example #17
0
    def test_structure_declaration_no_error(self):
        tokens_list = [
            Token("struct", "", 1),
            Token("id", 1, 1),
            Token("left_brace", "", 1),
            Token("newline", "", 1),
            Token("var", "", 2),
            Token("id", 2, 2),
            Token("assignment", "", 2),
            Token("number", 3, 2),
            Token("newline", "", 2),
            Token("right_brace", "", 3),
            Token("newline", "", 3),
        ]
        table = SymbolTable()
        table.entry("my_struct", "var", "variable")
        table.entry("a", "int", "variable")
        table.entry("a", "int", "constant")

        opcode, _, _ = struct_declaration_statement(tokens=tokens_list,
                                                    i=1,
                                                    table=table)

        self.assertEqual(opcode, OpCode("struct_decl", "my_struct", ""))
Example #18
0
 def setUp(self):
     self.table = SymbolTable()