def testParseCallExpr(self): self.assertEqual(ParseExprFromStr('整老王')[0], CallExpr('老王', [])) self.assertEqual( ParseExprFromStr('整老王(5)')[0], CallExpr('老王', [IntegerLiteralExpr(5)])) self.assertEqual( ParseExprFromStr('整老王(6)')[0], CallExpr('老王', [IntegerLiteralExpr(6)])) self.assertEqual( ParseExprFromStr('整老王(老刘,6)')[0], CallExpr( '老王', [VariableExpr('老刘'), IntegerLiteralExpr(6)])) self.assertEqual( ParseExprFromStr('整老王(“你”,老刘,6)')[0], CallExpr('老王', [ StringLiteralExpr('你'), VariableExpr('老刘'), IntegerLiteralExpr(6) ])) self.assertEqual( ParseExprFromStr('整老王(“你”,老刘,6)')[0], CallExpr('老王', [ StringLiteralExpr('你'), VariableExpr('老刘'), IntegerLiteralExpr(6) ]))
def testParsingDecrements(self): self.assertEqual(ParseToAst('老王稍稍。'), [ Statement(STMT_DEC_BY, (VariableExpr('老王'), IntegerLiteralExpr(1))) ]) self.assertEqual(ParseToAst('老王稍三步。'), [ Statement(STMT_DEC_BY, (VariableExpr('老王'), IntegerLiteralExpr(3))) ])
def testParsingComparison(self): self.assertEquals(ParseToAst('唠唠:2比5大。'), [ Statement( STMT_SAY, ComparisonExpr(IntegerLiteralExpr(2), Keyword('大'), IntegerLiteralExpr(5))) ])
def testParsingIncrements(self): self.assertEqual(ParseToAst('老王走走。'), [ Statement(STMT_INC_BY, (VariableExpr('老王'), IntegerLiteralExpr(1))) ]) self.assertEqual(ParseToAst('老王走两步。'), [ Statement(STMT_INC_BY, (VariableExpr('老王'), IntegerLiteralExpr(2))) ])
def testParsingLoop(self): self.assertEqual( ParseToAst('老王从1到9磨叽:磨叽完了。'), [Statement( STMT_LOOP, (IdentifierToken('老王'), IntegerLiteralExpr(1), IntegerLiteralExpr(9), []))])
def testParseTermExpr(self): self.assertEqual( ParseExprFromStr('老王乘五')[0], ArithmeticExpr(VariableExpr('老王'), Keyword('乘'), IntegerLiteralExpr(5))) self.assertEqual( ParseExprFromStr('五除以老王')[0], ArithmeticExpr(IntegerLiteralExpr(5), Keyword('除以'), VariableExpr('老王'))) self.assertEqual( ParseExprFromStr('五除以老王乘老刘')[0], ArithmeticExpr( ArithmeticExpr(IntegerLiteralExpr(5), Keyword('除以'), VariableExpr('老王')), Keyword('乘'), VariableExpr('老刘')))
def testParseArithmeticExpr(self): self.assertEqual(ParseExprFromStr('5加六')[0], ArithmeticExpr( IntegerLiteralExpr(5), Keyword('加'), IntegerLiteralExpr(6) )) self.assertEqual(ParseExprFromStr('5加六乘3')[0], ArithmeticExpr( IntegerLiteralExpr(5), Keyword('加'), ArithmeticExpr( IntegerLiteralExpr(6), Keyword('乘'), IntegerLiteralExpr(3)))) self.assertEqual(ParseExprFromStr('5减六减老王')[0], ArithmeticExpr( ArithmeticExpr( IntegerLiteralExpr(5), Keyword('减'), IntegerLiteralExpr(6) ), Keyword('减'), VariableExpr('老王')) )
def testParseConcatExpr(self): self.assertEqual( ParseExprFromStr('老王加油、2、“哈”')[0], ConcatExpr([ ArithmeticExpr(VariableExpr('老王'), Keyword('加'), VariableExpr('油')), IntegerLiteralExpr(2), StringLiteralExpr('哈') ]))
def testParseConditional(self): self.assertEqual( ParseStmtFromStr('寻思:老王比五大?要行咧就唠唠:老王。')[0], Statement( STMT_CONDITIONAL, ( ComparisonExpr(VariableExpr('老王'), Keyword('大'), IntegerLiteralExpr(5)), # then-branch Statement(STMT_SAY, VariableExpr('老王')), # else-branch None)))
def testParseComparisonExpr(self): self.assertEqual(ParseExprFromStr('5比6大')[0], ComparisonExpr( IntegerLiteralExpr(5), Keyword('大'), IntegerLiteralExpr(6) )) self.assertEqual(ParseExprFromStr('老王加5比6小')[0], ComparisonExpr( ArithmeticExpr( VariableExpr('老王'), Keyword('加'), IntegerLiteralExpr(5)), Keyword('小'), IntegerLiteralExpr(6) )) self.assertEqual(ParseExprFromStr('老王跟老刘一样一样的')[0], ComparisonExpr( VariableExpr('老王'), Keyword('一样一样的'), VariableExpr('老刘') )) self.assertEqual(ParseExprFromStr('老王加5跟6不是一样一样的')[0], ComparisonExpr( ArithmeticExpr( VariableExpr('老王'), Keyword('加'), IntegerLiteralExpr(5)), Keyword('不是一样一样的'), IntegerLiteralExpr(6) ))
def testParseInteger(self): self.assertEqual(ParseExprFromStr('5')[0], IntegerLiteralExpr(5)) self.assertEqual(ParseExprFromStr('九')[0], IntegerLiteralExpr(9))
def testParsingFuncCallWithParam(self): self.assertEqual( ParseToAst('整【阶乘】(五)。'), [Statement(STMT_CALL, CallExpr('阶乘', [IntegerLiteralExpr(5)]))])
def testParseConcatExpr(self): self.assertEqual( ParseExprFromStr('老王、2')[0], ConcatExpr([VariableExpr('老王'), IntegerLiteralExpr(2)]))