<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;"># Checks whether an expression can be generated by the following grammar,
# and in case the answer is yes, evaluates the expression and displays its value.
#                  EXPRESSION --&gt; TERM SUM_OPERATOR EXPRESSION
#                  EXPRESSION --&gt; TERM
#                  TERM --&gt; FACTOR MULT_OPERATOR TERM
#                  TERM --&gt; FACTOR
#                  FACTOR --&gt; NUMBER
#                  FACTOR --&gt; (EXPRESSION)
#                  NUMBER --&gt; DIGIT NUMBER | NUMBER --&gt; DIGIT
#                  DIGIT --&gt; 0 | ... | 9
#                  SUM_OPERATOR --&gt; + | -
#                  MULT_OPERATOR --&gt; * | /
#
#  Written by Eric Martin for COMP9021


def evaluate_expression(expression, start, end):
    start, term_value = evaluate_term(expression, start, end)
    if term_value == None:
        return -1, None
    if start == end:
        return end, term_value
    for i in range(start, end):
        if expression[i].isspace():
            continue
        if expression[i] == '+':
            start, expression_value = evaluate_expression(expression, i + 1, end)
            if expression_value == None:
                return -1, None
            return start, term_value + expression_value
        if expression[i] == '-':
            start, expression_value = evaluate_expression(expression, i + 1, end)
            if expression_value == None:
                return -1, None
            return start, term_value - expression_value
        return i, term_value
    return -1, None


def evaluate_term(term, start, end):
    start, factor_value = evaluate_factor(term, start, end)
    if factor_value == None:
        return -1, None
    if start == end:
        return end, factor_value
    for i in range(start, end):
        if term[i].isspace():
            continue
        if term[i] == '*':
            start, term_value = evaluate_term(term, i + 1, end)
            if term_value == None:
                return -1, None
            return start, factor_value * term_value
        if term[i] == '/':
            start, term_value = evaluate_term(term, i + 1, end)
            if not term_value:
                return -1, None
            return start, factor_value / term_value
        return i, factor_value
    return -1, None


def evaluate_factor(factor, start, end):
    for i in range(start, end):
        if factor[i].isspace():
            continue
        if factor[i].isdigit():
            return evaluate_number(factor, i, end)
        if factor[i] == '(':
            start, expression_value = evaluate_expression(factor, i + 1, end)
            if expression_value == None:
                return -1, None
            for i in range(start, end):
                if not factor[i].isspace():
                    break
            if i &lt; end and factor[i] == ')':
                return i + 1, expression_value
        return -1, None
    return -1, None


def evaluate_number(number, start, end):
    result = int(number[start])
    if start + 1 == end:
        return end, result
    for i in range(start + 1, end):
        if number[i].isdigit():
            result = 10 * result + int(number[i])
        else:
            break
    return i, result

    
expression = input('Input expression: ')
_, value = evaluate_expression(expression, 0, len(expression))
if value != None:
    print('The expression evaluates to: {:}'.format(value))
else:
    print('Incorrect syntax')





</pre></body></html>