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)
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)
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)
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)