summaryrefslogtreecommitdiff
path: root/examples/SimpleCalc.py
diff options
context:
space:
mode:
authorPaul McGuire <ptmcg@austin.rr.com>2019-08-03 16:08:29 -0500
committerPaul McGuire <ptmcg@austin.rr.com>2019-08-03 16:08:29 -0500
commit36aa91c4f603ddb15054b0ff9f5daf5044b1dd31 (patch)
treea5dde20d0aa5c2c431855f4bc901255e7e5da691 /examples/SimpleCalc.py
parentb9c11d7f84c9886ba037d6b3f7e2f6ec27f5ed45 (diff)
downloadpyparsing-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.py239
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!")