diff options
author | Paul McGuire <ptmcg@austin.rr.com> | 2019-08-03 16:08:29 -0500 |
---|---|---|
committer | Paul McGuire <ptmcg@austin.rr.com> | 2019-08-03 16:08:29 -0500 |
commit | 36aa91c4f603ddb15054b0ff9f5daf5044b1dd31 (patch) | |
tree | a5dde20d0aa5c2c431855f4bc901255e7e5da691 /examples/SimpleCalc.py | |
parent | b9c11d7f84c9886ba037d6b3f7e2f6ec27f5ed45 (diff) | |
download | pyparsing-git-36aa91c4f603ddb15054b0ff9f5daf5044b1dd31.tar.gz |
Update fourFn.py to handle functions that take multiple args, and nested functions
Diffstat (limited to 'examples/SimpleCalc.py')
-rw-r--r-- | examples/SimpleCalc.py | 239 |
1 files changed, 122 insertions, 117 deletions
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!") |