Multi-line optimizations
Added multi line optimizations. So far, the code is not able to eliminate repetitions, but I plan to address this problem later.
This commit is contained in:
parent
d5de52d73c
commit
e47bf59320
@ -53,6 +53,27 @@ RENAME = parser.RENAME
|
|||||||
ARROW = parser.ARROW
|
ARROW = parser.ARROW
|
||||||
|
|
||||||
|
|
||||||
|
def replace_leaves(node, context):
|
||||||
|
'''
|
||||||
|
Node is a parsed tree
|
||||||
|
context is a dictionary containing
|
||||||
|
parsed trees as values.
|
||||||
|
|
||||||
|
If a name appearing in node appears
|
||||||
|
also in context, the parse tree is
|
||||||
|
modified to replace the node with the
|
||||||
|
subtree found in context.
|
||||||
|
'''
|
||||||
|
print(node, ' ' ,node.__class__)
|
||||||
|
if node.kind == parser.UNARY:
|
||||||
|
replace_leaves(node.child, context)
|
||||||
|
elif node.kind == parser.BINARY:
|
||||||
|
replace_leaves(node.left, context)
|
||||||
|
replace_leaves(node.right, context)
|
||||||
|
elif node.name in context:
|
||||||
|
replace_node(node, context[node.name])
|
||||||
|
|
||||||
|
|
||||||
def replace_node(replace, replacement):
|
def replace_node(replace, replacement):
|
||||||
'''This function replaces "replace" node with the node "with",
|
'''This function replaces "replace" node with the node "with",
|
||||||
the father of the node will now point to the with node'''
|
the father of the node will now point to the with node'''
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
from relational import optimizations
|
from relational import optimizations
|
||||||
from relational import parser
|
from relational import parser
|
||||||
|
from relational.maintenance import UserInterface
|
||||||
|
|
||||||
|
|
||||||
# Stuff that was here before, keeping it for compatibility
|
# Stuff that was here before, keeping it for compatibility
|
||||||
@ -38,6 +39,24 @@ tokenize = parser.tokenize
|
|||||||
tree = parser.tree
|
tree = parser.tree
|
||||||
# End of the stuff
|
# End of the stuff
|
||||||
|
|
||||||
|
def optimize_program(code, rels):
|
||||||
|
'''
|
||||||
|
Optimize an entire program, composed by multiple expressions
|
||||||
|
and assignments.
|
||||||
|
'''
|
||||||
|
lines = code.split('\n')
|
||||||
|
context = {}
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
line = line.strip()
|
||||||
|
if line.startswith(';') or not line:
|
||||||
|
continue
|
||||||
|
res, query = UserInterface.split_query(line)
|
||||||
|
last_res = res
|
||||||
|
parsed = parser.tree(query)
|
||||||
|
optimizations.replace_leaves(parsed, context)
|
||||||
|
context[res] = parsed
|
||||||
|
return optimize_all(context[last_res], rels)
|
||||||
|
|
||||||
def optimize_all(expression, rels, specific=True, general=True, debug=None):
|
def optimize_all(expression, rels, specific=True, general=True, debug=None):
|
||||||
'''This function performs all the available optimizations.
|
'''This function performs all the available optimizations.
|
||||||
|
Loading…
Reference in New Issue
Block a user