# 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 9 years ago.
file: exercise_3.py