Beispiel #1
0
 def testParser(self):
     testList=[('''0''', Id(0)),
               ('''Sin(x)''', FunctionCall(Id('Sin'),List([Id('x')]))),
               ('''Arctan(x)''', FunctionCall(Id('Arctan'),List([Id('x')]))),
               ('''Sqrt(4)''', FunctionCall(Id('Sqrt'),List([Id('4')]))),
               ('''ArcTan(x)''', FunctionCall(Id('ArcTan'),List([Id('x')]))),
               ('''x^2''', Pow(Id('x'), Id('2'))),
               ('''a+b''', Plus(Id('a'), Id('b'))),
               ('''a*b''', Times(Id('a'), Id('b'))),
               ('''a!''', Fact(Id('a'))),
               ('''2*a!''', Times(Id(2),Fact(Id('a')))),
               ('''a!!''', Fact(Fact(Id('a')))),
               ('''-a!''', Opp(Fact(Id('a')))),
               ('''b+a!''', Plus(Id('b'), Fact(Id('a')))),
               ('''-a-a''', Minus(Opp(Id('a')), Id('a'))),
               ('''--a''', Opp(Opp(Id('a')))),
               ('''+a''', Id('a')),
               ('''+-a''', Opp(Id('a'))),
               ('''-+a''', Opp(Id('a'))),
               ('''a*-b''', Times(Id('a'),Opp(Id('b')))),
               ('''-a*b''', Times(Opp(Id('a')),Id('b'))),
               ('''-a^b''', Opp(Pow(Id('a'),Id('b')))),
               ('''-c**d''', Opp(Pow(Id('c'),Id('d')))),
               ('''a/b''', Divide(Id('a'), Id('b'))),
               ('''a-b''', Minus(Id('a'), Id('b'))),
               ('''a^b''', Pow(Id('a'), Id('b'))),
               ('''a^b/c''', Divide(Pow(Id('a'),Id('b')),Id('c'))),
               ('''-a^b/c''', Divide(Opp(Pow(Id('a'),Id('b'))),Id('c'))),
               ('''(a+b)''', Plus(Id('a'), Id('b'))),
               ('''(a*b)''', Times(Id('a'), Id('b'))),
               ('''(a/b)''', Divide(Id('a'), Id('b'))),
               ('''(a-b)''', Minus(Id('a'), Id('b'))),
               ('''(a^b)''', Pow(Id('a'), Id('b'))),
               ('''(a)^b''', Pow(Id('a'), Id('b'))),
               ('''(a+b)*c''', Times((Plus(Id('a'), Id('b'))), Id('c'))),
               ('''a+(b*c)''', Plus(Id('a'), Times(Id('b'), Id('c')))),
               ('''a+b*c''', Plus(Id('a'), Times(Id('b'), Id('c')))),
               ('''a^b^c''', Pow(Id('a'),Pow(Id('b'), Id('c')))),
               ('''a*b/c''', Divide(Times(Id('a'),Id('b')),Id('c'))),
               ('''a+b/c''', Plus(Id('a'),Divide(Id('b'),Id('c')))),
               ('''x^n/n!''', Divide(Pow(Id('x'),Id('n')),Fact(Id('n')))),
               ('''a^n%b!''', Mod(Pow(Id('a'),Id('n')),Fact(Id('b')))),
               ('''a!%b^c+d''', Plus(Mod(Fact(Id('a')),Pow(Id('b'),Id('c'))),Id('d'))),
               ('''a^G(x)''', Pow(Id('a'),FunctionCall(Id('G'),List([Id('x')])))),
               ('''f(x)+f(x)''', Plus(FunctionCall(Id('f'),List([Id('x')])),FunctionCall(Id('f'),List([Id('x')])))),
               ('''f(x)^G(x)''', Pow(FunctionCall(Id('f'),List([Id('x')])),FunctionCall(Id('G'),List([Id('x')])))),
               ('''Sin(x)^2+Cos(x)^2''', Plus(Pow(FunctionCall(Id('Sin'),List([Id('x')])),Id(2)),Pow(FunctionCall(Id('Cos'),List([Id('x')])),Id(2)))),
               ('''Sum(1/i^6, i, 1, Infinity)''',FunctionCall(Id('Sum'),List([Divide(Id('1'),Pow(Id('i'),Id('6'))), Id('i'), Id('1'), Id('Infinity')]))),
               ('''Sum(Sum(j/i^6, i, 1, Infinity), j, 0 ,m)''', FunctionCall(Id('Sum'),List([FunctionCall(Id('Sum'),List([Divide(Id('j'),Pow(Id('i'),Id('6'))), Id('i'), Id('1'), Id('Infinity')])), Id('j'), Id('0'), Id('m')]))),
               ('''Integrate(1/(x^3 + 1), x)''', FunctionCall(Id('Integrate'),List([Divide(Id('1'),Plus(Pow(Id('x'),Id('3')),Id('1'))), Id('x')]))),
               ('''Integrate(1/(x^3 + 1), x, 0, 1)''', FunctionCall(Id('Integrate'),List([Divide(Id('1'),Plus(Pow(Id('x'),Id('3')),Id('1'))), Id('x'), Id('0'), Id('1')]))),
               ('''Integrate(Integrate(Sin(x*y), x, 0, 1), y, 0, x)''', FunctionCall(Id('Integrate'),List([FunctionCall(Id('Integrate'),List([FunctionCall(Id('Sin'),List([Times(Id('x'),Id('y'))])), Id('x'), Id('0'), Id('1')])), Id('y'), Id('0'), Id('x')]))),
               ('''Limit(Sin(x)/x, x, 0)''', FunctionCall(Id('Limit'),List([Divide(FunctionCall(Id('Sin'),List([Id('x')])),Id('x')), Id('x'), Id('0')]))),
               ('''Limit((1+x/n)^n, x, Infinity)''', FunctionCall(Id('Limit'),List([Pow(Plus(Id('1'),Divide(Id('x'),Id('n'))),Id('n')), Id('x'), Id('Infinity')]))),
               ('''Pow(1024,1/2)''', FunctionCall(Id('Pow'),List([Id('1024'), Divide(Id('1'),Id('2'))]))),
               ]
     for (expr, res) in testList:
         self.assertEqual(str(calchasParser.parse(expr, lexer=calchasLexer)), str(res))
Beispiel #2
0
 def testParser(self):
     self.maxDiff = None
     testList=[('''0''', Id(0)),
               ('''Sin(x)''', FunctionCall(Id('Sin'),List([Id('x')]))),
               ('''Arctan(x)''', FunctionCall(Id('Arctan'),List([Id('x')]))),
               ('''Sqrt(4)''', FunctionCall(Id('Sqrt'),List([Id('4')]))),
               ('''ArcTan(x)''', FunctionCall(Id('ArcTan'),List([Id('x')]))),
               ('''x^2''', FunctionCall(Id('Pow'),List([Id('x'), Id('2')]))),
               ('''a+b''', FunctionCall(Id('Add'),List([Id('a'), Id('b')]))),
               ('''a*b''', FunctionCall(Id('Mul'),List([Id('a'), Id('b')]))),
               ('''a!''', FunctionCall(Id('Fact'),List([Id('a')]))),
               ('''2*a!''', FunctionCall(Id('Mul'),List([Id('2'), FunctionCall(Id('Fact'),List([Id('a')]))]))),
               ('''a!!''', FunctionCall(Id('Fact'),List([FunctionCall(Id('Fact'),List([Id('a')]))]))),
               ('''-a!''', FunctionCall(Id('Mul'),List([Id('-1'), FunctionCall(Id('Fact'),List([Id('a')]))]))),
               ('''b+a!''', FunctionCall(Id('Add'),List([Id('b'), FunctionCall(Id('Fact'),List([Id('a')]))]))),
               ('''-a-a''', FunctionCall(Id('Add'),List([FunctionCall(Id('Mul'),List([Id('-1'), Id('a')])), FunctionCall(Id('Mul'),List([Id('a'), Id('-1')]))]))),
               ('''--a''', FunctionCall(Id('Mul'),List([Id('-1'), FunctionCall(Id('Mul'),List([Id('-1'), Id('a')]))]))),
               ('''+a''', Id('a')),
               ('''+-a''', FunctionCall(Id('Mul'),List([Id('-1'), Id('a')]))),
               ('''-+a''', FunctionCall(Id('Mul'),List([Id('-1'), Id('a')]))),
               ('''a*-b''', FunctionCall(Id('Mul'),List([Id('a'), FunctionCall(Id('Mul'),List([Id('-1'), Id('b')]))]))),
               ('''-a*b''', FunctionCall(Id('Mul'),List([FunctionCall(Id('Mul'),List([Id('-1'), Id('a')])), Id('b')]))),
               ('''-a^b''', FunctionCall(Id('Mul'),List([Id('-1'), FunctionCall(Id('Pow'),List([Id('a'), Id('b')]))]))),
               ('''-c**d''', FunctionCall(Id('Mul'),List([Id('-1'), FunctionCall(Id('Pow'),List([Id('c'), Id('d')]))]))),
               ('''a/b''', FunctionCall(Id('Mul'),List([Id('a'), FunctionCall(Id('Pow'),List([Id('b'), Id('-1')]))]))),
               ('''a-b''', FunctionCall(Id('Add'),List([Id('a'), FunctionCall(Id('Mul'),List([Id('b'), Id('-1')]))]))),
               ('''a^b''', FunctionCall(Id('Pow'),List([Id('a'), Id('b')]))),
               ('''a^b/c''', FunctionCall(Id('Mul'),List([FunctionCall(Id('Pow'),List([Id('a'), Id('b')])), FunctionCall(Id('Pow'),List([Id('c'), Id('-1')]))]))),
               ('''-a^b/c''', FunctionCall(Id('Mul'),List([FunctionCall(Id('Mul'),List([Id('-1'), FunctionCall(Id('Pow'),List([Id('a'), Id('b')]))])), FunctionCall(Id('Pow'),List([Id('c'), Id('-1')]))]))),
               ('''(a+b)''', FunctionCall(Id('Add'),List([Id('a'), Id('b')]))),
               ('''(a*b)''', FunctionCall(Id('Mul'),List([Id('a'), Id('b')]))),
               ('''(a/b)''', FunctionCall(Id('Mul'),List([Id('a'), FunctionCall(Id('Pow'),List([Id('b'), Id('-1')]))]))),
               ('''(a-b)''', FunctionCall(Id('Add'),List([Id('a'), FunctionCall(Id('Mul'),List([Id('b'), Id('-1')]))]))),
               ('''(a^b)''', FunctionCall(Id('Pow'),List([Id('a'), Id('b')]))),
               ('''(a)^b''', FunctionCall(Id('Pow'),List([Id('a'), Id('b')]))),
               ('''(a+b)*c''', FunctionCall(Id('Mul'),List([FunctionCall(Id('Add'),List([Id('a'), Id('b')])), Id('c')]))),
               ('''a+(b*c)''', FunctionCall(Id('Add'),List([Id('a'), FunctionCall(Id('Mul'),List([Id('b'), Id('c')]))]))),
               ('''a+b*c''', FunctionCall(Id('Add'),List([Id('a'), FunctionCall(Id('Mul'),List([Id('b'), Id('c')]))]))),
               ('''a^b^c''', FunctionCall(Id('Pow'),List([Id('a'), FunctionCall(Id('Pow'),List([Id('b'), Id('c')]))]))),
               ('''a*b/c''', FunctionCall(Id('Mul'),List([FunctionCall(Id('Mul'),List([Id('a'), Id('b')])), FunctionCall(Id('Pow'),List([Id('c'), Id('-1')]))]))),
               ('''a+b/c''', FunctionCall(Id('Add'),List([Id('a'), FunctionCall(Id('Mul'),List([Id('b'), FunctionCall(Id('Pow'),List([Id('c'), Id('-1')]))]))]))),
               ('''x^n/n!''', FunctionCall(Id('Mul'),List([FunctionCall(Id('Pow'),List([Id('x'), Id('n')])), FunctionCall(Id('Pow'),List([FunctionCall(Id('Fact'),List([Id('n')])), Id('-1')]))]))),
               ('''a^n%b!''', FunctionCall(Id('Mod'),List([FunctionCall(Id('Pow'),List([Id('a'), Id('n')])), FunctionCall(Id('Fact'),List([Id('b')]))]))),
               ('''a!%b^c+d''', FunctionCall(Id('Add'),List([FunctionCall(Id('Mod'),List([FunctionCall(Id('Fact'),List([Id('a')])), FunctionCall(Id('Pow'),List([Id('b'), Id('c')]))])), Id('d')]))),
               ('''a^G(x)''', FunctionCall(Id('Pow'),List([Id('a'), FunctionCall(Id('G'),List([Id('x')]))]))),
               ('''f(x)+f(x)''', FunctionCall(Id('Add'),List([FunctionCall(Id('f'),List([Id('x')])), FunctionCall(Id('f'),List([Id('x')]))]))),
               ('''f(x)^G(x)''', FunctionCall(Id('Pow'),List([FunctionCall(Id('f'),List([Id('x')])), FunctionCall(Id('G'),List([Id('x')]))]))),
               ('''Sin(x)^2+Cos(x)^2''', FunctionCall(Id('Add'),List([FunctionCall(Id('Pow'),List([FunctionCall(Id('Sin'),List([Id('x')])), Id('2')])), FunctionCall(Id('Pow'),List([FunctionCall(Id('Cos'), List([Id('x')])), Id('2')]))]))),
               ('''Sum(1/i^6, i, 1, Infinity)''', FunctionCall(Id('Sum'),List([FunctionCall(Id('Mul'),List([Id('1'), FunctionCall(Id('Pow'),List([FunctionCall(Id('Pow'),List([Id('i'), Id('6')])), Id('-1')]))])), Id('i'), Id('1'), Id('Infinity')]))),
               ('''Sum(Sum(j/i^6, i, 1, Infinity), j, 0 ,m)''', FunctionCall(Id('Sum'),List([FunctionCall(Id('Sum'),List([FunctionCall(Id('Mul'),List([Id('j'), FunctionCall(Id('Pow'),List([FunctionCall(Id('Pow'),List([Id('i'), Id('6')])), Id('-1')]))])), Id('i'), Id('1'), Id('Infinity')])), Id('j'), Id('0'), Id('m')]))),
               ('''Integrate(1/(x^3 + 1), x)''', FunctionCall(Id('Integrate'),List([FunctionCall(Id('Mul'),List([Id('1'), FunctionCall(Id('Pow'),List([FunctionCall(Id('Add'),List([FunctionCall(Id('Pow'),List([Id('x'), Id('3')])), Id('1')])), Id('-1')]))])), Id('x')]))),
               ('''Integrate(1/(x^3 + 1), x, 0, 1)''', FunctionCall(Id('Integrate'),List([FunctionCall(Id('Mul'),List([Id('1'), FunctionCall(Id('Pow'),List([FunctionCall(Id('Add'),List([FunctionCall(Id('Pow'),List([Id('x'), Id('3')])), Id('1')])), Id('-1')]))])), Id('x'), Id('0'), Id('1')]))),
               ('''Integrate(Integrate(Sin(x*y), x, 0, 1), y, 0, x)''', FunctionCall(Id('Integrate'),List([FunctionCall(Id('Integrate'),List([FunctionCall(Id('Sin'),List([FunctionCall(Id('Mul'),List([Id('x'), Id('y')]))])), Id('x'), Id('0'), Id('1')])), Id('y'), Id('0'), Id('x')]))),
               ('''Limit(Sin(x)/x, x, 0)''', FunctionCall(Id('Limit'),List([FunctionCall(Id('Mul'),List([FunctionCall(Id('Sin'),List([Id('x')])), FunctionCall(Id('Pow'),List([Id('x'), Id('-1')]))])), Id('x'), Id('0')]))),
               ('''Limit((1+x/n)^n, x, Infinity)''', FunctionCall(Id('Limit'),List([FunctionCall(Id('Pow'),List([FunctionCall(Id('Add'),List([Id('1'), FunctionCall(Id('Mul'),List([Id('x'), FunctionCall(Id('Pow'),List([Id('n'), Id('-1')]))]))])), Id('n')])), Id('x'), Id('Infinity')]))),
               ('''Pow(1024,1/2)''', FunctionCall(Id('Pow'),List([Id('1024'), FunctionCall(Id('Mul'),List([Id('1'), FunctionCall(Id('Pow'),List([Id('2'), Id('-1')]))]))]))),
               ('''cos\'(x)''', FunctionCall(Id('diff'),List([FunctionCall(Id('cos'),List([Id('x')])), Id('x'), Id('1')]))),
               ("cos''''''''''''''''''''''''''''''''''''''''''(x)", FunctionCall(Id('diff'),List([FunctionCall(Id('cos'),List([Id('x')])), Id('x'), Id('42')]))),
               ("x | y", FunctionCall(Id('Or'),List([Id('x'), Id('y')]))),
               ("~ y", FunctionCall(Id('Not'),List([Id('y')]))),
               ("x & y", FunctionCall(Id('And'),List([Id('x'), Id('y')]))),
               ("x | ~z & ~ y", FunctionCall(Id('Or'),List([Id('x'), FunctionCall(Id('And'),List([FunctionCall(Id('Not'),List([Id('z')])), FunctionCall(Id('Not'),List([Id('y')]))]))]))),
               ]
     for (expr, res) in testList:
         self.assertEqual(str(calchasParser.parse(expr, lexer=calchasLexer)), str(res))
def parseCalchas(formula):
    return calchasParser.parse(preprocessImplicitMultiplication(formula), lexer=calchasLexer)