Compare commits

..

No commits in common. "eef872c3f80ea53a3a8d27c247ac234d5b29e64c" and "41bf0e0ab7d6affb3415abd8cecd2011831f50d1" have entirely different histories.

View File

@ -1,16 +1,17 @@
from block import * from block import *
def tp(sth): def tp(sth):
if sth ==None: try:
return -1 a = float(sth)
if sth[0] >='0' and sth[0] <='9':
return 2 return 2
if sth[0] != '_': except:
return 0 if sth[0] == '_':
return 1 return 0
return 1
class DAGNode: class DAGNode:
cnt = 1 cnt = 1
def __init__(self,tag=None,l=None,r=None,op=None): def __init__(self,tag,l=None,r=None,op=None):
self.cnt = DAGNode.cnt self.cnt = DAGNode.cnt
DAGNode.cnt += 1 DAGNode.cnt += 1
self.parents = [] self.parents = []
@ -18,78 +19,38 @@ class DAGNode:
self.rc = r self.rc = r
self.op = op self.op = op
self.main_tag = tag self.main_tag = tag
self.other_tag = set() self.other_tag = set(tag)
if tag is not None:
self.other_tag.add(tag)
def insert(self,tag):
self.other_tag.add(tag)
if tp(tag) > tp(self.main_tag):
self.main_tag = tag
def has(self,tag):
return tag in self.other_tag
class Optimizer: class Optimizer:
def __init__(self): def __init__(self):
self.nodes = [""] self.DAGNodes = set()
self.cnt = 0 def optimize(self, lst):
self.ans= [] # print(lst)
def cfind(self,tag): self.build(lst)
for i in range(1,self.cnt+1)[::-1]: return [1]
if self.nodes[i].has(tag): def insert(self,a,b):
return self.nodes[i] pass
self.cnt += 1
self.nodes.append(DAGNode(tag=tag)) def build(self, lst):
return self.nodes[self.cnt] for i in lst:
def cfind_op1(self,op,lc,rc): op = i.a
for i in range(1,self.cnt+1)[::-1]: l = i.b
if self.nodes[i].op==op and ((self.nodes[i].lc == lc and self.nodes[i].rc == rc) or (self.nodes[i].lc == rc and self.nodes[i].rc == lc)): r = i.c
return self.nodes[i] ans = i.d
self.cnt +=1 if op == '=':
self.nodes.append(DAGNode(op=op,l=lc,r=rc))
return self.nodes[self.cnt]
def cfind_op2(self,op,lc,rc):
for i in range(1, self.cnt + 1)[::-1]:
if self.nodes[i].op == op and self.nodes[i].lc == lc and self.nodes[i].rc == rc:
return self.nodes[i]
self.cnt += 1
self.nodes.append(DAGNode(op=op, l=lc, r=rc))
return self.nodes[self.cnt]
def build(self,lst):
self.ans = []
for _ in lst:
op,a,b,res = _.a,_.b,_.c,_.d
if op =='=':
# 将ans插入到a的节点中
self.cfind(a).insert(res)
elif op =='+' or op=='*' or op=='&' or op=='^' or op =='|' or op =='&&' or op =='||' or op =='==' or op == '!=':
# 首先找一下有没有a b节点 , 没有就自己造一个
aNode = self.cfind(a)
bNode = self.cfind(b)
# 然后找一下有没有a op b 的节点 , 有的话插进去
# 这里并不能根据a ,b 来查找 , 因为昔人已乘黄鹤去 , 你找到的或许只是曾经的ab
self.cfind_op1(op,aNode,bNode).insert(res)
elif op =='-' or op=='%' or op=='/':
# 这种不换的元素符
self.cfind_op2(op,self.cfind(a),self.cfind(b)).insert(ans)
pass pass
# 剩下就是while end , if end , el等 , 不用管
for i in range(1,self.cnt+1)[::-1]:
_ = self.nodes[i]
op = _.op
if op is not None:
self.ans.append(FourTuple(op,_.lc.main_tag,_.rc.main_tag,_.main_tag))
for __ in _.other_tag:
if __ != _.main_tag:
self.ans.append(FourTuple('=',_.main_tag,c='_',d=__))
self.ans = self.ans[::-1]
if __name__ == '__main__': if __name__ == '__main__':
divider = BlockDivider(l) divider = BlockDivider(l)
optimizer = Optimizer() optimizer = Optimizer()
ls = divider.run() ls = divider.run()
for l in ls:
optimizer.build(l)
for i in optimizer.ans:
print(i)
# print()
for l in ls:
# print(l)
ans = optimizer.optimize(l)
for _ in ans:
print(_)
print()