def SetupObjects(): global functions, e, pi, constants Sin = Expression.FunctionElement('sin', 'sin', 'cos(x)', 'x') Cos = Expression.FunctionElement('cos', 'cos', '-sin(x)', 'x') Tan = Expression.FunctionElement('tan', 'tan', '1/(cos(x)^2)', 'x') Arcsin = Expression.FunctionElement('arcsin', 'arcsin', '1/sqrt(1-x^2)', 'x') Arccos = Expression.FunctionElement('arccos', 'arccos', '-1/sqrt(1-x^2)', 'x') Arctan = Expression.FunctionElement('arctan', 'arctan', '1/(1+x^2)', 'x') Sinh = Expression.FunctionElement('sinh', 'sinh', 'cosh(x)', 'x') Cosh = Expression.FunctionElement('cosh', 'cosh', 'sinh(x)', 'x') Sqrt = Expression.FunctionElement('sqrt', 'sqrt', '1/(2sqrt(x))', 'x') Ln = Expression.FunctionElement('ln', 'ln', '1/x', 'x') Exp = Expression.FunctionElement('e^x', 'e^x', 'e^x', 'x') functions = [ Sin, Cos, Tan, Arcsin, Arccos, Arctan, Sinh, Cosh, Sqrt, Ln, Exp ] e = Expression.NumberElement(2.7182818) pi = Expression.NumberElement(3.14159265358) constants = [e, pi]
def ParseBlock(input, start_index, depth): global expression cur_block = Expression.ExpressionBlock() i = start_index var_last = False while i < len(input): char = input[i] if char in STARTBLOCK: block, endIndex = ParseBlock(input, i + 1, depth + 1) cur_block.append(block) i = endIndex var_last = False elif char in ENDBLOCK: if (depth == 0): warnings.warn("Klammern Falsch") return cur_block, i elif (Tools.IsNumber(char)): number, endIndex = getNumber(input, i) i = endIndex - 1 if (var_last): cur_block.append(Expression.multiplyOperator) cur_block.append(Expression.NumberElement(number)) if (i <= len(input) - 2): if (Tools.IsChar(input[i + 1])): cur_block.append(Expression.multiplyOperator) var_last = False elif (Tools.IsOperator(char)): op = Tools.IsOperator(char) cur_block.append(op) var_last = False elif (Tools.IsChar(char)): word, endIndex = getWord(input, i) endVariables = endIndex + 1 func = None vars = False # testet, ob die char-kette einen funktionennamen enthält for f in PredefinedObjects.functions: if f.name in word: ind = word.index(f.name) if func == None or len(f.name) > len(func.name): endVariables = ind func = f #break if ( func == None or endVariables != i ): # fügt alle variablen vor der function mit multiply operator hinzu for k in range(endVariables - i): vars = True var = word[k] variableElement = None for variableEl in expression.variables: if variableEl.variable == var: variableElement = variableEl break if (variableElement == None): variableElement = Expression.VariableElement(var) expression.variables.append(variableElement) cur_block.append(variableElement) if (k != endVariables - i - 1): cur_block.append(Expression.multiplyOperator) var_last = vars if (func != None and vars): # und ggf. auch die function cur_block.append(Expression.multiplyOperator) cur_block.append(func) elif (func != None): cur_block.append(func) """ if (func): cur_block.append(func) else: # produkt von variablen for k in range(len(word)): var = word[k] cur_block.append(VariableElement(var)) if (k!=(len(word)-1)): cur_block.append(multiplyOperator)""" i = endIndex i += 1 return cur_block, i