From 36aa91c4f603ddb15054b0ff9f5daf5044b1dd31 Mon Sep 17 00:00:00 2001 From: Paul McGuire Date: Sat, 3 Aug 2019 16:08:29 -0500 Subject: Update fourFn.py to handle functions that take multiple args, and nested functions --- examples/SimpleCalc.py | 239 +++++++++++++++++++++++++------------------------ 1 file changed, 122 insertions(+), 117 deletions(-) (limited to 'examples/SimpleCalc.py') diff --git a/examples/SimpleCalc.py b/examples/SimpleCalc.py index 15a1817..d52a20f 100644 --- a/examples/SimpleCalc.py +++ b/examples/SimpleCalc.py @@ -1,117 +1,122 @@ -# SimpleCalc.py -# -# Demonstration of the parsing module, -# Sample usage -# -# $ python SimpleCalc.py -# Type in the string to be parse or 'quit' to exit the program -# > g=67.89 + 7/5 -# 69.29 -# > g -# 69.29 -# > h=(6*g+8.8)-g -# 355.25 -# > h + 1 -# 356.25 -# > 87.89 + 7/5 -# 89.29 -# > ans+10 -# 99.29 -# > quit -# Good bye! -# -# - - - -# Uncomment the line below for readline support on interactive terminal -# import readline -from pyparsing import ParseException, Word, alphas, alphanums -import math - -# Debugging flag can be set to either "debug_flag=True" or "debug_flag=False" -debug_flag=False - -variables = {} - -from fourFn import BNF, exprStack, fn, opn -def evaluateStack( s ): - op = s.pop() - if op == 'unary -': - return -evaluateStack( s ) - if op in "+-*/^": - op2 = evaluateStack( s ) - op1 = evaluateStack( s ) - return opn[op]( op1, op2 ) - elif op == "PI": - return math.pi # 3.1415926535 - elif op == "E": - return math.e # 2.718281828 - elif op in fn: - return fn[op]( evaluateStack( s ) ) - elif op[0].isalpha(): - if op in variables: - return variables[op] - raise Exception("invalid identifier '%s'" % op) - else: - return float( op ) - -arithExpr = BNF() -ident = Word(alphas, alphanums).setName("identifier") -assignment = ident("varname") + '=' + arithExpr -pattern = assignment | arithExpr - -if __name__ == '__main__': - # input_string - input_string='' - - # Display instructions on how to quit the program - print("Type in the string to be parsed or 'quit' to exit the program") - input_string = input("> ") - - while input_string.strip().lower() != 'quit': - if input_string.strip().lower() == 'debug': - debug_flag=True - input_string = input("> ") - continue - - # Reset to an empty exprStack - del exprStack[:] - - if input_string != '': - # try parsing the input string - try: - L=pattern.parseString(input_string, parseAll=True) - except ParseException as err: - L=['Parse Failure', input_string, (str(err), err.line, err.column)] - - # show result of parsing the input string - if debug_flag: print(input_string, "->", L) - if len(L)==0 or L[0] != 'Parse Failure': - if debug_flag: print("exprStack=", exprStack) - - # calculate result , store a copy in ans , display the result to user - try: - result=evaluateStack(exprStack) - except Exception as e: - print(str(e)) - else: - variables['ans']=result - print(result) - - # Assign result to a variable if required - if L.varname: - variables[L.varname] = result - if debug_flag: print("variables=", variables) - else: - print('Parse Failure') - err_str, err_line, err_col = L[-1] - print(err_line) - print(" "*(err_col-1) + "^") - print(err_str) - - # obtain new input string - input_string = input("> ") - - # if user type 'quit' then say goodbye - print("Good bye!") +# SimpleCalc.py +# +# Demonstration of the parsing module, +# Sample usage +# +# $ python SimpleCalc.py +# Type in the string to be parse or 'quit' to exit the program +# > g=67.89 + 7/5 +# 69.29 +# > g +# 69.29 +# > h=(6*g+8.8)-g +# 355.25 +# > h + 1 +# 356.25 +# > 87.89 + 7/5 +# 89.29 +# > ans+10 +# 99.29 +# > quit +# Good bye! +# +# + + + +# Uncomment the line below for readline support on interactive terminal +# import readline +from pyparsing import ParseException, Word, alphas, alphanums + +# Debugging flag can be set to either "debug_flag=True" or "debug_flag=False" +debug_flag=False + +variables = {} + +from fourFn import BNF, exprStack, fn, opn, evaluate_stack + +# from fourFn import BNF, exprStack, fn, opn +# def evaluateStack( s ): +# op = s.pop() +# if op == 'unary -': +# return -evaluateStack( s ) +# if op in "+-*/^": +# op2 = evaluateStack( s ) +# op1 = evaluateStack( s ) +# return opn[op]( op1, op2 ) +# elif op == "PI": +# return math.pi # 3.1415926535 +# elif op == "E": +# return math.e # 2.718281828 +# elif op in fn: +# return fn[op]( evaluateStack( s ) ) +# elif op[0].isalpha(): +# if op in variables: +# return variables[op] +# raise Exception("invalid identifier '%s'" % op) +# else: +# return float( op ) + +arithExpr = BNF() +ident = Word(alphas, alphanums).setName("identifier") +assignment = ident("varname") + '=' + arithExpr +pattern = assignment | arithExpr + +if __name__ == '__main__': + # input_string + input_string='' + + # Display instructions on how to quit the program + print("Type in the string to be parsed or 'quit' to exit the program") + input_string = input("> ") + + while input_string.strip().lower() != 'quit': + if input_string.strip().lower() == 'debug': + debug_flag=True + input_string = input("> ") + continue + + # Reset to an empty exprStack + del exprStack[:] + + if input_string != '': + # try parsing the input string + try: + L = pattern.parseString(input_string, parseAll=True) + except ParseException as err: + L = ['Parse Failure', input_string, (str(err), err.line, err.column)] + + # show result of parsing the input string + if debug_flag: print(input_string, "->", L) + if len(L)==0 or L[0] != 'Parse Failure': + if debug_flag: print("exprStack=", exprStack) + + for i, ob in enumerate(exprStack): + if isinstance(ob, str) and ob in variables: + exprStack[i] = str(variables[ob]) + + # calculate result , store a copy in ans , display the result to user + try: + result=evaluate_stack(exprStack) + except Exception as e: + print(str(e)) + else: + variables['ans']=result + print(result) + + # Assign result to a variable if required + if L.varname: + variables[L.varname] = result + if debug_flag: print("variables=", variables) + else: + print('Parse Failure') + err_str, err_line, err_col = L[-1] + print(err_line) + print(" "*(err_col-1) + "^") + print(err_str) + + # obtain new input string + input_string = input("> ") + + # if user type 'quit' then say goodbye + print("Good bye!") -- cgit v1.2.1