2025-10-20
Enter a postfix expression: 6 2 5 + *
6 2 5 + *
42
Enter a postfix expression: 10 2 300 *+ 20/
10 2 300 * + 20 /
30
Enter a postfix expression: 3 + 4
3 + 4
Error:
Too few operands on the stack
Portion of the expression processed: 3 +
Operands on the stack: : 3
Enter a postfix expression: 5 6 %
5 6 %
Error:
Unknown token type
Portion of the expression processed: 5 6 %
Operands on the stack: : 5 6
Enter a postfix expression: Expression:
Error: Expression contains no tokens
Portion of expression processed: none
The stack is empty
Expression: 1 2 3 +
Error: Too many operands on the stack
Portion of expression processed: 1 2 3 +
Operands on the stack: 1 5
Expression: 1 + 2 3 4 *
Error: Too few operands on the stack
Portion of expression processed: 1 +
Operands on the stack: 1
Expression: 1 2 % 3 +
Error: Unknown token type
Portion of expression processed: 1 2 %
Operands on the stack: 1 2
Expression: 1 2 0 / +
Error: divide by zero
Portion of expression processed: 1 2 0/
Operands on the stack: 1The following class diagram illustrates the relationships between the main components for evaluating postfix expressions:

Model and the Evaluator classes utilize the Scanner class.Evaluator uses the Scanner to parse tokens from the input expression.Model uses the Scanner to format and standardize the expression string for display and processing.hasNext and next methods to iterate through tokens one at a time.value and a type.PLUS, MINUS, MUL, DIV, and INT.
+, -, *, and /.INT tokens are created by converting numeric substrings (e.g., "534") to integers.The updated interaction diagram illustrates the methods and relationships among the main components for evaluating postfix expressions:

"""Token program for processing expressions."""
class Token:
UNKNOWN = 0 # Unknown
INT = 4 #Integer
MINUS = 5 # minus operator
PLUS = 6 # Plus Operator
MUL = 7 # Multiply operator
DIV = 8 #divid operator
EXPO = 9 # Exponent operator
LPAR = 10 # Left Par operator
RPAR = 11 # Right Par operator
FIRST_OP = 5 # First operator code
# Contrcutor
def __init__(self, value):
if type(value) == int:
self.type = Token.INT
else:
self.type = self.makeType(value)
self.value = value
def makeType(self, ch):
if ch == "*": return Token.MUL
elif ch == "/": return Token.DIV
elif ch == '+': return Token.PLUS
elif ch == '-': return Token.MINUS
elif ch == '^': return Token.EXPO
elif ch == '(': return Token.LPAR
elif ch == ')': return Token.RPAR
else: return Token.UNKNOWN
def isOperator(self):
return self.type >=Token.FIRST_OP
def __str__(self):
return str(self.value)
def getType(self):
return self.type
def getValue(self):
return self.value
def getPrecedence(self):
"""returns the precedence level"""
myType = self.type
if myType ==Token.EXPO: return 3
if myType in (Token.MUL, Token.DIV) : return 2
if myType in (Token.PLUS, Token.MINUS) : return 1
else: return 0
def main():
# Run some testers here
plus = Token("+")
minus = Token("-")
mul = Token("*")
div = Token("/")
expo = Token("^")
unknown = Token("#")
anint = Token(34)
print(plus, minus, mul, div, expo, unknown, anint)
if __name__ == '__main__':
main() """A Scanner for processing all expressions. """
from mytoken import Token
class Scanner(object):
# Define variables for End of expression and a tab
EOE = ';'
TAB = '\t'
# Constructor
def __init__(self, sourceStr):
self.sourceStr = sourceStr
self.getFirstToken()
def hasNext(self):
return self.currentToken != None
def next(self):
if not self.hasNext():
raise Exception("There is no more token")
temp = self.currentToken
self.getNextToken()
return temp
def getFirstToken(self):
self.index = 0
self.currentChar =self.sourceStr[0]
self.getNextToken()
def getNextToken(self):
self.skipWhiteSPaces()
if self.currentChar.isdigit():
self.currentToken = Token(self.getInteger())
elif self.currentChar == Scanner.EOE:
self.currentToken = None
else:
self.currentToken = Token(self.currentChar)
self.nextChar()
def nextChar(self):
if self.index >=len(self.sourceStr) - 1:
self.currentChar = Scanner.EOE
else:
self.index += 1
self.currentChar = self.sourceStr[self.index]
def skipWhiteSPaces(self):
while self.currentChar in (' ', Scanner.TAB):
self.nextChar()
def getInteger(self):
num = 0
while True:
num = num * 10 + int(self.currentChar)
self.nextChar()
if not self.currentChar.isdigit():
break
return num
def main():
while True:
sourceStr = input("Enter an expression: ")
if sourceStr.strip() == "":
break
scanner = Scanner(sourceStr)
while scanner.hasNext():
print(scanner.next())
if __name__ == '__main__':
main()