| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- # 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!")
|