# 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 --> TERM SUM_OPERATOR EXPRESSION
#                  EXPRESSION --> TERM
#                  TERM --> FACTOR MULT_OPERATOR TERM
#                  TERM --> FACTOR
#                  FACTOR --> NUMBER
#                  FACTOR --> (EXPRESSION)
#                  NUMBER --> DIGIT NUMBER | NUMBER --> DIGIT
#                  DIGIT --> 0 | ... | 9
#                  SUM_OPERATOR --> + | -
#                  MULT_OPERATOR --> * | /
#
#  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 < 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')





Resource created Monday 12 October 2015, 09:39:02 AM.

file: exercise_3.py


Back to top

COMP9021 15s2 (Principles of Programming) is powered by WebCMS3
CRICOS Provider No. 00098G