the-honk/school/a-level/Y12 2022-2024/Logic/Custom Expressions.py

89 lines
2.2 KiB
Python
Raw Normal View History

2024-10-09 17:02:48 +00:00
from enum import Enum
from typing import Tuple, List
class Gate(Enum):
AND = '^'
OR = ''
XOR = ''
NAND = ''
NOR = ''
XNOR = ''
class Symbol:
def __init__(self, character):
self.char = character
def __str__(self):
return self.char
class Expression:
def __init__(self, symbol):
self.tree: List[Tuple[Gate, Expression]] = []
self.initialSymbol = symbol
def AND(self, symbol):
self.tree.append((Gate.AND, symbol))
return self
def OR(self, symbol):
self.tree.append((Gate.OR, symbol))
return self
def XOR(self, symbol):
self.tree.append((Gate.XOR, symbol))
return self
def NAND(self, symbol):
self.tree.append((Gate.NAND, symbol))
return self
def NOR(self, symbol):
self.tree.append((Gate.NOR, symbol))
return self
def XNOR(self, symbol):
self.tree.append((Gate.XNOR, symbol))
return self
@staticmethod
def treeSymbols(tree):
symbols = set([])
for _, value in tree:
if isinstance(value, Expression):
if str(value.initialSymbol) not in symbols:
symbols.add(str(value.initialSymbol))
symbols.update(Expression.treeSymbols(value.tree))
elif str(value) not in symbols:
symbols.add(str(value))
return symbols
def compile(self):
# Count symbols
symbols = Expression.treeSymbols(self.tree)
def run(*values):
for gate, value in self._tree:
def __str__(self):
out = str(self.initialSymbol)
for gate, value in self.tree:
if isinstance(value, Expression) and len(value.tree) > 0:
expression = f'({value})'
else:
expression = str(value)
out += f' {gate.value} {expression}'
return out
A = Symbol('A')
B = Symbol('B')
C = Symbol('C')
D = Symbol('D')
# A.AND(B).execute()
Expression(A).AND(Expression(B).AND(A)).OR(Expression(C).XOR(Expression(A).OR(D))).compile()