From 1bbc7174c7360c408f01b6f6da8c47b77d394f07 Mon Sep 17 00:00:00 2001 From: Aadhavan Srinivasan Date: Sun, 26 Nov 2023 11:12:48 -0500 Subject: [PATCH] Added additional error-checking --- calculator.py | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/calculator.py b/calculator.py index c84afea..e224e9d 100644 --- a/calculator.py +++ b/calculator.py @@ -1,34 +1,47 @@ import re from parse import * +# List of valid operators +opers = ['+', '-', '*', '/'] + # Regular expression that checks for valid characters in an expression -valid_chars = '[0-9.\(\)+-\/*]' +valid_chars = '[ 0-9.\(\)+-\/*]' -def raise_error(error_code): +def print_error(error_code): # List of error codes: - # 0 - Invalid characters found in expression - # 1 - Unclosed parantheses + # 1 - Invalid characters found in expression + # 2 - Unclosed parantheses match error_code: - case 0: - print("You have invalid characters in your expression.") case 1: + print("You have invalid characters in your expression.") + case 2: print("You have an unclosed parantheses in your expression.") + case 3: + print("You have two operators next to each other.") - main() # Re-enter main loop - def check_errors(expr): # Check if number of opening parantheses is equal to number of closing parantheses num_open_pars = 0 num_close_pars = 0 for val in expr: - num_open_pars += 1 if val == '(' - num_close_pars += 1 if val == ')' - if num_open_pars != num_close_pars: - raise_error(2) - + if not re.match(valid_chars, val): + return 1 + num_open_pars = num_open_pars+1 if val == '(' else num_open_pars + num_close_pars = num_close_pars+1 if val == ')' else num_close_pars + + if val in opers: + #Check if the next element is an operator. If it is, throw an error + continue + + if num_open_pars != num_close_pars: + return 2 + + + return 0 + def evaluate(subexpr): # Evaluate a tokenized expression, that contains no parantheses @@ -84,7 +97,10 @@ def find_inner(subexpr): def main(): while True: expr = input() - check_for_errors(expr) + errno = check_errors(expr) + if errno != 0: + print_error(errno) + continue # If an error was generated, print an error message and continue on to the next iteration of the loop expr = find_inner(expr) print(expr)