def test_parse_expression4(self): parser = testParser(lexer.lexer) res = parser.parse("x' == 0") res.visit() self.assertEqual(res.type, 'Equal') self.assertEqual(res.children[0].type, 'ClockRate') self.assertEqual(res.children[0].leaf, 'x') self.assertEqual(res.children[1].type, 'Number') self.assertEqual(res.children[1].leaf, 0) res = parser.parse("y >= 5 && x' == 0") res.visit() self.assertEqual(res.type, 'And') self.assertEqual(len(res.children), 2) self.assertEqual(res.children[0].type, 'GreaterEqual') self.assertEqual(res.children[0].children[0].type, 'Identifier') self.assertEqual(res.children[0].children[0].leaf, 'y') self.assertEqual(res.children[0].children[1].type, 'Number') self.assertEqual(res.children[0].children[1].leaf, 5) self.assertEqual(res.children[1].type, 'Equal') self.assertEqual(res.children[1].children[0].type, 'ClockRate') self.assertEqual(res.children[1].children[0].leaf, 'x') self.assertEqual(res.children[1].children[1].type, 'Number') self.assertEqual(res.children[1].children[1].leaf, 0)
def test_parse_func_with_params(self): parser = testParser(lexer.lexer) res = parser.parse("ishit(4)") self.assertEqual(res.type, "FunctionCall") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].leaf, "ishit") #parameters self.assertEqual(len(res.leaf), 1) self.assertEqual(res.leaf[0].type, "Number") self.assertEqual(res.leaf[0].leaf, 4) res = parser.parse("cache.ishit(4)") self.assertEqual(res.type, "FunctionCall") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].leaf, "cache") self.assertEqual(res.children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].leaf, "ishit") #parameters self.assertEqual(len(res.leaf), 1) self.assertEqual(res.leaf[0].type, "Number") self.assertEqual(res.leaf[0].leaf, 4) res = parser.parse("cache.ishit(acc)") self.assertEqual(res.type, "FunctionCall") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].leaf, "cache") self.assertEqual(res.children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].leaf, "ishit") #parameters self.assertEqual(len(res.leaf), 1) self.assertEqual(res.leaf[0].type, "Identifier") self.assertEqual(res.leaf[0].leaf, "acc") res = parser.parse("ishit(4, 5, x, True, a.b.c)") res.visit() self.assertEqual(res.type, "FunctionCall") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].leaf, "ishit") #parameters self.assertEqual(len(res.leaf), 5) self.assertEqual(res.leaf[0].type, "Number") self.assertEqual(res.leaf[0].leaf, 4) self.assertEqual(res.leaf[1].type, "Number") self.assertEqual(res.leaf[1].leaf, 5) self.assertEqual(res.leaf[2].type, "Identifier") self.assertEqual(res.leaf[2].leaf, "x") self.assertEqual(res.leaf[3].type, "True") self.assertEqual(res.leaf[4].type, "Identifier") self.assertEqual(res.leaf[4].leaf, "a") self.assertEqual(res.leaf[4].children[0].type, "Identifier") self.assertEqual(res.leaf[4].children[0].leaf, "b") self.assertEqual(res.leaf[4].children[0].children[0].type, "Identifier") self.assertEqual(res.leaf[4].children[0].children[0].leaf, "c")
def test_parse_array_index_expression(self): parser = testParser(lexer.lexer) res = parser.parse("a[1] == 2") #parser = testParser(lexer.lexer) #res = pars.parse() #res.visit() self.assertEqual(res.type, "Equal") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].type, "Index") self.assertEqual(res.children[0].children[0].leaf.type, "Number") self.assertEqual(res.children[0].children[0].leaf.leaf, 1) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 2) res = parser.parse("N-1") self.assertEqual(res.type, "Minus") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].leaf, 'N') self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 1)
def test_parse_expression3(self): parser = testParser(lexer.lexer) res = parser.parse("(x == true) && (0 > N-0-1)") self.assertEqual(res.type, 'And') self.assertEqual(len(res.children), 2) self.assertEqual(res.children[0].type, 'Equal') self.assertEqual(res.children[0].children[0].type, 'Identifier') self.assertEqual(res.children[0].children[0].leaf, 'x') self.assertEqual(res.children[0].children[1].type, 'True') self.assertEqual(res.children[1].type, 'Greater') self.assertEqual(res.children[1].children[0].type, 'Number') self.assertEqual(res.children[1].children[0].leaf, 0) self.assertEqual(res.children[1].children[1].type, 'Minus') self.assertEqual(res.children[1].children[1].children[0].type, 'Minus') self.assertEqual(res.children[1].children[1].children[0].children[0].type, 'Identifier') self.assertEqual(res.children[1].children[1].children[0].children[0].leaf, 'N') self.assertEqual(res.children[1].children[1].children[0].children[1].type, 'Number') self.assertEqual(res.children[1].children[1].children[0].children[1].leaf, 0) self.assertEqual(res.children[1].children[1].children[1].type, 'Number') self.assertEqual(res.children[1].children[1].children[1].leaf, 1) res = parser.parse("x == true && (0 > N-0-1)") self.assertEqual(res.type, 'And') self.assertEqual(len(res.children), 2) self.assertEqual(res.children[0].type, 'Equal') self.assertEqual(res.children[0].children[0].type, 'Identifier') self.assertEqual(res.children[0].children[0].leaf, 'x') self.assertEqual(res.children[0].children[1].type, 'True') self.assertEqual(res.children[1].type, 'Greater') self.assertEqual(res.children[1].children[0].type, 'Number') self.assertEqual(res.children[1].children[0].leaf, 0) self.assertEqual(res.children[1].children[1].type, 'Minus') self.assertEqual(res.children[1].children[1].children[0].type, 'Minus') self.assertEqual(res.children[1].children[1].children[0].children[0].type, 'Identifier') self.assertEqual(res.children[1].children[1].children[0].children[0].leaf, 'N') self.assertEqual(res.children[1].children[1].children[0].children[1].type, 'Number') self.assertEqual(res.children[1].children[1].children[0].children[1].leaf, 0) self.assertEqual(res.children[1].children[1].children[1].type, 'Number') self.assertEqual(res.children[1].children[1].children[1].leaf, 1)
def test_parse_expression2(self): parser = testParser(lexer.lexer) res = parser.parse("(N - 0 - 1)") self.assertEqual(res.type, "Minus") self.assertEqual(res.children[0].type, "Minus") self.assertEqual(res.children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].leaf, 'N') self.assertEqual(res.children[0].children[1].type, "Number") self.assertEqual(res.children[0].children[1].leaf, 0) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 1) res = parser.parse("-42") self.assertEqual(res.type, "UnaryMinus") self.assertEqual(res.children[0].type, "Number") self.assertEqual(res.children[0].leaf, 42) res = parser.parse("-(42+1)") self.assertEqual(res.type, "UnaryMinus") self.assertEqual(res.children[0].type, "Plus") self.assertEqual(res.children[0].children[0].type, "Number") self.assertEqual(res.children[0].children[0].leaf, 42) self.assertEqual(res.children[0].children[1].type, "Number") self.assertEqual(res.children[0].children[1].leaf, 1) res = parser.parse("N- 0- 1") self.assertEqual(res.type, "Minus") self.assertEqual(res.children[0].type, "Minus") self.assertEqual(res.children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].leaf, 'N') self.assertEqual(res.children[0].children[1].type, "Number") self.assertEqual(res.children[0].children[1].leaf, 0) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 1) res = parser.parse("N-0-1") self.assertEqual(res.type, "Minus") self.assertEqual(res.children[0].type, "Minus") self.assertEqual(res.children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].leaf, 'N') self.assertEqual(res.children[0].children[1].type, "Number") self.assertEqual(res.children[0].children[1].leaf, 0) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 1) res = parser.parse("(x == 5 && y == 4)") self.assertEqual(res.type, "And") self.assertEqual(res.children[0].type, "Equal") self.assertEqual(res.children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].leaf, 'x') self.assertEqual(res.children[0].children[1].type, "Number") self.assertEqual(res.children[0].children[1].leaf, 5) self.assertEqual(res.children[1].children[0].type, "Identifier") self.assertEqual(res.children[1].children[0].leaf, 'y') self.assertEqual(res.children[1].children[1].type, "Number") self.assertEqual(res.children[1].children[1].leaf, 4) res = parser.parse("True") self.assertEqual(res.type, "True") res = parser.parse("true") res.visit() self.assertEqual(res.type, "True") res = parser.parse("x[0][1] == True") self.assertEqual(res.type, "Equal") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].leaf, 'x') self.assertEqual(res.children[0].children[0].type, "Index") self.assertEqual(res.children[0].children[0].leaf.type, 'Number') self.assertEqual(res.children[0].children[0].leaf.leaf, 0) self.assertEqual(res.children[0].children[1].type, "Index") self.assertEqual(res.children[0].children[1].leaf.type, 'Number') self.assertEqual(res.children[0].children[1].leaf.leaf, 1) self.assertEqual(res.children[1].type, "True") res = parser.parse("msg[ 0 ][ N - 0 - 1 ] == True") self.assertEqual(res.type, "Equal") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].leaf, 'msg') self.assertEqual(res.children[0].children[0].type, "Index") self.assertEqual(res.children[0].children[0].leaf.type, 'Number') self.assertEqual(res.children[0].children[0].leaf.leaf, 0) self.assertEqual(res.children[0].children[1].type, "Index") index2 = res.children[0].children[1].leaf self.assertEqual(index2.type, 'Minus') self.assertEqual(index2.children[0].type, 'Minus') self.assertEqual(index2.children[0].children[0].type, 'Identifier') self.assertEqual(index2.children[0].children[0].leaf, 'N') self.assertEqual(index2.children[0].children[1].type, 'Number') self.assertEqual(index2.children[0].children[1].leaf, 0) self.assertEqual(res.children[1].type, "True")
def test_parse_expression(self): parser = testParser(lexer.lexer) res = parser.parse("") #should not fail self.assertFalse(res) res = parser.parse(" ") #should not fail self.assertFalse(res) res = parser.parse("5") self.assertEqual(res.type, "Number") self.assertEqual(res.leaf, 5) res = parser.parse("5 > 5") self.assertEqual(res.type, "Greater") self.assertEqual(res.children[0].type, "Number") self.assertEqual(res.children[0].leaf, 5) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 5) res = parser.parse("5 != 5") #res.visit() self.assertEqual(res.type, "NotEqual") self.assertEqual(res.children[0].type, "Number") self.assertEqual(res.children[0].leaf, 5) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 5) res = parser.parse("!True") self.assertEqual(res.type, "UnaryNot") self.assertEqual(res.children[0].type, 'True') res = parser.parse("5 && 4") self.assertEqual(res.type, "And") self.assertEqual(res.children[0].type, "Number") self.assertEqual(res.children[0].leaf, 5) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 4) res = parser.parse("5 and 4") self.assertEqual(res.type, "And") self.assertEqual(res.children[0].type, "Number") self.assertEqual(res.children[0].leaf, 5) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 4) res = parser.parse("!(5 && 4)") self.assertEqual(res.type, "UnaryNot") self.assertEqual(res.children[0].type, "And") self.assertEqual(res.children[0].children[0].type, "Number") self.assertEqual(res.children[0].children[0].leaf, 5) self.assertEqual(res.children[0].children[1].type, "Number") self.assertEqual(res.children[0].children[1].leaf, 4) res = parser.parse("not (5 && 4)") self.assertEqual(res.type, "UnaryNot") self.assertEqual(res.children[0].type, "And") self.assertEqual(res.children[0].children[0].type, "Number") self.assertEqual(res.children[0].children[0].leaf, 5) self.assertEqual(res.children[0].children[1].type, "Number") self.assertEqual(res.children[0].children[1].leaf, 4) res = parser.parse("5 || 4") self.assertEqual(res.type, "Or") self.assertEqual(res.children[0].type, "Number") self.assertEqual(res.children[0].leaf, 5) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 4) res = parser.parse("5 or 4") self.assertEqual(res.type, "Or") self.assertEqual(res.children[0].type, "Number") self.assertEqual(res.children[0].leaf, 5) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 4) res = parser.parse("5 < 5 and 4 > 3") self.assertEqual(res.type, "And") self.assertEqual(res.children[0].type, "Less") self.assertEqual(res.children[0].children[0].type, "Number") self.assertEqual(res.children[0].children[0].leaf, 5) self.assertEqual(res.children[0].children[1].type, "Number") self.assertEqual(res.children[0].children[1].leaf, 5) res = parser.parse("3 * 2 + 4") self.assertEqual(res.type, "Plus") self.assertEqual(res.children[0].type, "Times") self.assertEqual(res.children[0].children[0].type, "Number") self.assertEqual(res.children[0].children[0].leaf, 3) self.assertEqual(res.children[0].children[1].type, "Number") self.assertEqual(res.children[0].children[1].leaf, 2) self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 4) res = parser.parse("Viking1.safe and Viking2.safe") #TODO add struct support self.assertEqual(res.type, "And") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].leaf, "Viking1") self.assertEqual(res.children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].leaf, "safe") self.assertEqual(res.children[1].type, "Identifier") self.assertEqual(res.children[1].leaf, "Viking2") self.assertEqual(res.children[1].children[0].type, "Identifier") self.assertEqual(res.children[1].children[0].leaf, "safe") res = parser.parse( "Viking1.safe and Viking2.safe and Viking3.safe and Viking4.safe") self.assertEqual(res.type, "And") self.assertEqual(res.children[0].type, "And") self.assertEqual(res.children[1].type, "Identifier") self.assertEqual(res.children[1].leaf, "Viking4") self.assertEqual(res.children[1].children[0].type, "Identifier") self.assertEqual(res.children[1].children[0].leaf, "safe") self.assertEqual(res.children[0].children[0].type, "And") self.assertEqual(res.children[0].children[1].type, "Identifier") self.assertEqual(res.children[0].children[1].leaf, "Viking3") self.assertEqual(res.children[0].children[1].children[0].type, "Identifier") self.assertEqual(res.children[0].children[1].children[0].leaf, "safe") self.assertEqual(res.children[0].children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].children[0].leaf, "Viking1") self.assertEqual(res.children[0].children[0].children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].children[0].children[0].leaf, "safe") self.assertEqual(res.children[0].children[0].children[1].type, "Identifier") self.assertEqual(res.children[0].children[0].children[1].leaf, "Viking2") self.assertEqual(res.children[0].children[0].children[1].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].children[1].children[0].leaf, "safe") res = parser.parse("N - 1") self.assertEqual(res.type, "Minus") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].leaf, 'N') self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 1) res = parser.parse("f() == 2") self.assertEqual(res.type, "Equal") self.assertEqual(res.children[0].type, "FunctionCall") self.assertEqual(res.children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].leaf, "f") self.assertEqual(res.children[1].type, "Number") self.assertEqual(res.children[1].leaf, 2) res = parser.parse("dbm.isEmpty()") self.assertEqual(res.type, "FunctionCall") self.assertEqual(res.children[0].type, "Identifier") self.assertEqual(res.children[0].leaf, "dbm") self.assertEqual(res.children[0].children[0].type, "Identifier") self.assertEqual(res.children[0].children[0].leaf, "isEmpty")