diff --git a/calculator.py b/calculator.py index aaa937e..de36b9f 100644 --- a/calculator.py +++ b/calculator.py @@ -1,3 +1,41 @@ +""" +=============================================================================== +ENGR 13300 Fall 2023 + +Program Description + An algebraic expression calculator. This program can evaluate expressions, assign values to variables, and use variables in additional expressions. + + The program consists of three main parts: + 1. Parsing the expression. This is accomplished using the 'parse' function, defined in parse.py. The expression is parsed, and a list of 'tokens' is produced, with each token bein a part of the expression. For example '5 + 7 * 3' is parsed into '['5', '+', '7', '*', '3']. + 2. Find the inner-most expression. This only applies to expressions that have parantheses. The 'find_inner' function is called recursively, until the inner expression is found. For example, given the expression '3 + (7 * (4 + 8))', the 'find_inner' function is called once, to produce '7 * (4 + 8)', and then called again, to produce '4 + 8'. + 3. Evaluate the expression. The 'evaluate' function searches for operators, and then evaluates the operator with the preceding and succeeding token (if one of the tokens is a variable, the value of the variable replaces the variable). The result of the evaluation replaces the expression. Example: Given the expression '3 + (7 * (4 + 8))', the inner expression is evaluated first. This produces '3 + (7 * 12)'. The inner expression is evaluated again, producing '3 + 84'. Finally, the rest of the expression is evaluated, to produce 87. + 4. If the expression consists of an assignment, the evaluated expression is stored into the variable on the left. The list of variables is maintained as a dictionary. + +Assignment Information + Assignment: Individual Project + Author: Aadhavan Srinivasan, srini193@purdue.edu + Team ID: LC3 - 19 + + +Contributor: Name, login@purdue [repeat for each] + My contributor(s) helped me: + [ ] understand the assignment expectations without + telling me how they will approach it. + [ ] understand different ways to think about a solution + without helping me plan my solution. + [ ] think through the meaning of a specific error or + bug present in my code without looking at my code. + Note that if you helped somebody else with their code, you + have to list that person as a contributor here as well. + +ACADEMIC INTEGRITY STATEMENT +I have not used source code obtained from any other unauthorized +source, either modified or unmodified. Neither have I provided +access to my code to another. The project I am submitting +is my own original work. +=============================================================================== +""" + import re from parse import * @@ -28,8 +66,14 @@ def print_error(error_code): print("One of your values is improperly formatted.") case 5: print("Uninitialized variable.") + case 6: + print("Invalid expression.") + + return def check_errors(expr): + +# Check for errors before parsing the expression expr_small = expr.replace(" ", "") # Remove spaces from the string, to make it easier to parse # Check if number of opening parantheses is equal to number of closing parantheses @@ -56,12 +100,18 @@ def check_errors(expr): +# Check for errors after parsing the expression expr = parse(expr) + + if expr[0].isalpha() and (len(expr) == 1 or expr[1] != '='): # If you just have an expression with a letter eg. 'x', or you use a variable without an assignment (e.g. 'x 5') + return 6 + for val in expr: if val.count('.') > 1: # A value can have at most 1 period return 4 if val.isalpha() and not val in variables and val != expr[0]: # If the token is a string, and isn't in the dictionary, and isn't the variable at index 0 (e.g. 'x' in 'x = 4') return 5 + return 0