Пример #1
0
    def test_parse_unit(self):
        """Tests to check whether the following production rule is implemented
        correctly:
        <unit> ::= <identifier> | <number> | '(' <expr> ')' |
        <function> '(' <expr> ')'

        The parse tree for 'sqrt(a*2)' should be built as follows:
           {sqrt}
             |
            {*}
           /  |
         {a} {2}
        """
        root_node = expression_parser.Parser().parse('sqrt(a*2)')
        # Root node {sqrt}.
        self.assertIsInstance(root_node, expression_parser.UnaryFunctionNode)
        self.assertEqual(len(root_node.children), 1)

        child_1 = root_node.children[0]
        # Child 1 {*}.
        self.assertIsInstance(
            child_1, expression_parser.MultiplicationOperatorNode)
        self.assertEqual(len(child_1.children), 2)

        left_child_2, right_child_2 = child_1.children
        # Left child 2 {a}.
        self.assertIsInstance(left_child_2, expression_parser.IdentifierNode)
        self.assertEqual(left_child_2.token.text, 'a')
        self.assertEqual(len(left_child_2.children), 0)
        # Right child 2 {2}.
        self.assertIsInstance(right_child_2, expression_parser.NumberNode)
        self.assertEqual(right_child_2.token.text, '2')
        self.assertEqual(len(right_child_2.children), 0)
Пример #2
0
    def test_parse_mul_expr(self):
        """Tests to check whether the following production rule is implemented
        correctly:
        <mul_expr> ::= <pow_expr> (('*' | '/') <pow_expr>)*

        The parse tree for 'a / b * 2' should be built as follows:
              {*}
             /  |
           {/} {2}
          /  |
        {a} {b}
        """
        root_node = expression_parser.Parser().parse('a / b * 2')
        # Root node {*}.
        self.assertIsInstance(
            root_node, expression_parser.MultiplicationOperatorNode)
        self.assertEqual(len(root_node.children), 2)

        left_child_1, right_child_1 = root_node.children
        # Left child 1 {/}.
        self.assertIsInstance(
            left_child_1, expression_parser.DivisionOperatorNode)
        self.assertEqual(len(left_child_1.children), 2)
        # Right child 1 {2}.
        self.assertIsInstance(right_child_1, expression_parser.NumberNode)
        self.assertEqual(right_child_1.token.text, '2')
        self.assertEqual(len(right_child_1.children), 0)

        left_child_2, right_child_2 = left_child_1.children
        # Left child 2 {a}.
        self.assertIsInstance(left_child_2, expression_parser.IdentifierNode)
        self.assertEqual(left_child_2.token.text, 'a')
        self.assertEqual(len(left_child_2.children), 0)
        # Right child 2 {b}.
        self.assertIsInstance(right_child_2, expression_parser.IdentifierNode)
        self.assertEqual(right_child_2.token.text, 'b')
        self.assertEqual(len(right_child_2.children), 0)
Пример #3
0
    def test_parse_pow_expr(self):
        """Tests to check whether the following production rule is implemented
        correctly:
        <pow_expr> ::= '-' <pow_expr> | '+' <pow_expr> |
        <unit> ('^' <pow_expr>)?

        The parse tree for 'a ^ b ^ 2' should be built as follows:
              {^}
             /  |
           {a} {^}
              /  |
            {b} {2}
        """
        root_node = expression_parser.Parser().parse('a ^ b ^ 2')
        # Root node {^}.
        self.assertIsInstance(root_node, expression_parser.PowerOperatorNode)
        self.assertEqual(len(root_node.children), 2)

        left_child_1, right_child_1 = root_node.children
        # Left child 1 {a}.
        self.assertIsInstance(left_child_1, expression_parser.IdentifierNode)
        self.assertEqual(left_child_1.token.text, 'a')
        self.assertEqual(len(left_child_1.children), 0)
        # Right child 1 {^}.
        self.assertIsInstance(
            right_child_1, expression_parser.PowerOperatorNode)
        self.assertEqual(len(right_child_1.children), 2)

        left_child_2, right_child_2 = right_child_1.children
        # Left child 2 {b}.
        self.assertIsInstance(left_child_2, expression_parser.IdentifierNode)
        self.assertEqual(left_child_2.token.text, 'b')
        self.assertEqual(len(left_child_2.children), 0)
        # Right child 2 {2}.
        self.assertIsInstance(right_child_2, expression_parser.NumberNode)
        self.assertEqual(right_child_2.token.text, '2')
        self.assertEqual(len(right_child_2.children), 0)
Пример #4
0
    def test_parse(self):
        """Tests to check whether the following production rule is implemented
        correctly:
        <expr> ::= <mul_expr> (('+' | '-') <mul_expr>)*

        The parse tree for 'a + b - 2' should be built as follows:
              {-}
             /  |
           {+} {2}
          /  |
        {a} {b}
        """
        root_node = expression_parser.Parser().parse('a + b - 2')
        # Root node {-}.
        self.assertIsInstance(
            root_node, expression_parser.SubtractionOperatorNode)
        self.assertEqual(len(root_node.children), 2)

        left_child_1, right_child_1 = root_node.children
        # Left child 1 {+}.
        self.assertIsInstance(
            left_child_1, expression_parser.AdditionOperatorNode)
        self.assertEqual(len(left_child_1.children), 2)
        # Right child 1 {2}.
        self.assertIsInstance(right_child_1, expression_parser.NumberNode)
        self.assertEqual(right_child_1.token.text, '2')
        self.assertEqual(len(right_child_1.children), 0)

        left_child_2, right_child_2 = left_child_1.children
        # Left child 2 {a}.
        self.assertIsInstance(left_child_2, expression_parser.IdentifierNode)
        self.assertEqual(left_child_2.token.text, 'a')
        self.assertEqual(len(left_child_2.children), 0)
        # Right child 2 {b}.
        self.assertIsInstance(right_child_2, expression_parser.IdentifierNode)
        self.assertEqual(right_child_2.token.text, 'b')
        self.assertEqual(len(right_child_2.children), 0)