Преобразование выражения префикса в дерево разбора, но получить только половину выражения - PullRequest
0 голосов
/ 21 апреля 2020

Я создаю синтаксический анализатор, однако, когда я передаю строку, я получаю только половину результата, который равен D / C, когда я должен получить все выражение в инфиксном формате?

здесь мой код и лог c

class Node:
    def __init__(self, data, left=None, right=None):
        self.data, self.left, self.right = data, left, right

    def __str__(self):
        return self.data

    def infixPrintNode(self):

        if self:
            if self.right:
                self.right.infixPrintNode()
            print(self.data)
            if self.left:
                 self.left.infixPrintNode()






class ParseTree:

    def __init__(self, root = None):
        self.root = (root)
    def __str__(self):
         pass # to be implemented

    def fromprefix(self, expression=""):
        s = []

        right = Node("")
        left = Node("")

        for c in expression.split():
            if c == '(':
                s.append(Node(""))



            elif c.isnumeric() or c.isalpha():
                s.append(c)

            elif c in ["+", "-", "*", "/", "^", "#"]:
                s[-1].data = c

            elif len(s) > 1 and c == ")":
                rightchar = s.pop()
                leftchar = s.pop()
                r = Node("")
                l = Node("")
                r.data = rightchar;
                l.data = leftchar
                s[-1].left = l
                s[-1].right = r

            elif c == " ":
                pass

            else:
                pass

        self.root = s.pop()
        return self

    def printinfix(self):

        if self.root:
            self.root.infixPrintNode()

    t = ParseTree("x y +")

    # t.frominfix("( ( A * B ) + ( C / D ) )")

    t.fromprefix("( + ( * A B ) ( / C D ) ")
    t.printinfix()

Вот мой лог c:

  1. Encounter (затем создайте пустой узел
  2. , оператор столкновения вставьте его как данные в текущем узле
  3. встреча с операндом, вставка их в стек
  4. встреча) извлечение двух данных и назначение их в качестве левого и правого потомков
...