1

宿題のために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;

演算子の優先レベルを表す Integer を返す getPrecedence(): メソッドを追加する必要がありました。次のクラスも使用する必要がありました。

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 という名前のクラスで構成する必要があります。メイン関数は入力文字列を受け取り、それを使用してスキャナーを作成します。次に、スキャナーは、コンバーター オブジェクトのコンストラクターに引数として渡されます。次に、コンバーター オブジェクトの convert メソッドが実行され、中置式が変換されます。このメソッドは、後置文字列を表すトークンのリストを返します。メイン関数は、この文字列を表示します。これが私がこれまでに持っているものです:

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クラスでやろうとしていることがうまくいくかどうかさえわからない. 後置コンバーターへのはるかに単純な中置を見てきました。

4

0 に答える 0