Commit 97d5a67e authored by Martin Mareš's avatar Martin Mareš
Browse files

Výrazy: Učesání

parent 310babe8
#!/usr/bin/python3
#
# V elementárním řešení bylo nešikovné, že implementace operátorů byla
# roztroušená po celém programu, takže přidat nový operátor vyžadovalo
# projít celý program.
#
# Zde ukazujeme, jak oddělit implementaci operátorů do samostatných tříd
# (odvozených od nějaké společné třídy Node).
#
class Node:
......
#!/usr/bin/python3
#
# Naše objektové řešení obsahovalo spoustu duplicitního kódu: speciálně
# všechny binární operátory měly identické metody __init__ a velmi podobné
# metody __str__ a eval.
#
# Zde se duplicit zbavíme tím, že je přesuneme do společného předka:
# třídy BinaryNode, která popisuje chování obecného binárního operátoru.
# Každý konkrétní operátor si pak pouze dodefinuje, jak se jmenuje a jaké
# funkci odpovídá.
#
class Node:
......@@ -27,37 +37,40 @@ class BinaryNode(Node):
def __str__(self):
return '(' + str(self.left) + self.op_name + str(self.right) + ')'
def eval(self):
return self.eval_op(self.left.eval(), self.right.eval())
class AddNode(BinaryNode):
op_name = '+'
def eval(self):
return self.left.eval() + self.right.eval()
def eval_op(self, x, y):
return x + y
class SubNode(BinaryNode):
op_name = '-'
def eval(self):
return self.left.eval() - self.right.eval()
def eval_op(self, x, y):
return x - y
class MulNode(BinaryNode):
op_name = '*'
def eval(self):
return self.left.eval() * self.right.eval()
def eval_op(self, x, y):
return x * y
class DivNode(BinaryNode):
op_name = '/'
def eval(self):
return self.left.eval() // self.right.eval()
def eval_op(self, x, y):
return x // y
x = AddNode(MulNode(NumNode(3), NumNode(4)), SubNode(NumNode(5), NumNode(6)))
......
......@@ -39,14 +39,6 @@ class Node:
x = Node('+', Node('*', Node(3), Node(4)), Node('-', Node(5), Node(6)))
print(x)
# x.print_tree()
# print(x.eval())
# Další úkoly:
# - doplnit unární operátory (třeba 'N' pro negaci)
# - počítání hloubky stromu
# - výpis stromu v postfixovém tvaru
# - převod postfixového tvaru na strom
# - výpis stromu v infixovém tvaru bez zbytečných závorek
# - prevod infixového tvaru na strom (*)
# print(x)
x.print_tree()
print(x.eval())
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment