Конвертер инфиксов в постфиксы Python 2.7
Я пытаюсь создать конвертер инфикса в постфикс в python для домашнего задания, я нашел несколько онлайн, которые кажутся достаточно простыми, но ни один из них не отвечает требованиям, которые мне нужны. Я должен использовать следующие классы:
class Token(object):
UNKNOWN = 0 # unknown
INT = 4 # integer
MINUS = 5 # minus operator
PLUS = 6 # plus operator
MUL = 7 # multiply operator
DIV = 8 # divide operator
FIRST_OP = 5 # first operator code
def getPrecedence(self):
if self is '(':
return 0
elif self is '+'or '-':
return 1
elif self is '*' or '/':
return 2
else:
return 3
def _init_(self, value):
if type(value) == int:
self._type = Token.INT
else:
self._type = self._makeType(value)
self._value = value
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 _makeType(self, ch):
if ch == '*': return Token.MUL
elif ch == '/': return Token.DIV
elif ch == '+': return Token.PLUS
elif ch == '-': return Token.MINUS
else: return Token.UNKNOWN;
Мне пришлось добавить метод getPrecedence():, который возвращает Integer, представляющий уровень приоритета оператора. Я также должен был использовать следующий класс:
from token import Token
class Scanner(object):
EOE = ';' # end-of-expression
TAB = '\t' # tab
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 are no more tokens"
temp = self._currentToken
self._getNextToken()
return temp
def _getFirstToken(self):
self._index = 0
self._currentChar = self._sourceStr[0]
self._getNextToken()
def _getNextToken(self):
self._skipWhiteSpace()
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 _skipWhiteSpace(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
Я должен написать программу, которая преобразует инфиксное выражение в постфиксное выражение. Эта программа должна использовать классы Token и Scanner (которые я включил выше). Программа должна состоять из основной функции, которая преформирует входы и выходы, и класса с именем IFToPFConverter. Основная функция получает входную строку и создает с ней сканер. Затем сканер передается в качестве аргумента в конструктор объекта конвертера. Затем запускается метод преобразования объектов конвертера для преобразования инфиксного выражения. Этот метод возвращает список токенов, которые представляют строку постфикса. Затем основная функция отображает эту строку. Вот что у меня так далеко:
from arrayStack import ArrayStack
from token import Token
from scanner import Scanner
class IFToPFConverter(object):
def convert(self):
opStack = Stack()
postFixList = []
while self._scanner.hasNext():
currentToken = self._scanner.next()
if currentToken in '0123456789'
postFixList.append(currentToken)
elif currentToken == '(':
opStack.push(currentToken)
elif currentToken == '*':
opStack.push(currentToken)
elif currentToken == '/':
opStack.push(currentToken)
elif currentToken == '+':
opStack.push(currentToken)
elif currentToken == '-':
opStack.push(currentToken)
elif currentToken == ')':
opStack.push(currentToken)
while not opStack.isEmpty():
def main():
sourceStr = raw_input("Please enter an expression:")
scanner = Scanner(sourceStr)
conversion = IFToConverter.convert(scanner)
return conversion
main()
Я не знаю, куда идти дальше, я даже не знаю, сработает ли то, что я пытаюсь сделать в моем классе IFToPFConverter. Я видел гораздо более простые конвертеры инфиксов в постфиксы, я довольно новичок в программировании, так что мне кажется, что это много для понимания. Я мог бы использовать любую возможную помощь, спасибо заранее.