added stub for tree converter and removed redoundant and not-working parser

git-svn-id: http://galileo.dmi.unict.it/svn/relational/trunk@110 014f5005-505e-4b48-8d0a-63407b615a7c
master
LtWorf 2009-03-16 18:04:17 +07:00
parent 012607f876
commit f25959e50b
1 changed files with 11 additions and 84 deletions

@ -21,94 +21,16 @@
'''This module optimizes relational expressions into ones that require less time to be executed '''This module optimizes relational expressions into ones that require less time to be executed
For now it is highly experimental, and it shouldn't be used in 3rd party applications.''' For now it is highly experimental, and it shouldn't be used in 3rd party applications.'''
RELATION=0
UNARY=1
BINARY=2
class node (object): class node (object):
'''This class is a node of a relational expression. Leaves are relations and internal nodes are operations.''' '''This class is a node of a relational expression. Leaves are relations and internal nodes are operations.'''
RELATION=0
UNARY=1
BINARY=2
def __init__(self,expression): def __init__(self,expression):
expression=expression.strip() pass
print "Parsing: ",expression
'''expression must be a valid relational algrbra expression that would be accepted by the parser
and must be utf16'''
self.kind=0
self.name="a"
self.prop=""
'''*-ᑎᐅᐊᐅLEFTᐊᐅRIGHTᐊᐅFULLᐊπσρ'''
binary=(u"*",u"-",u"",u"")
unary=(u"π",u"σ",u"ρ")
'''(a (a b c d)) ᑎ c - σ i==3(πa,b(a b ᑎ c))'''
level=0 #Current parentesis level
start=-1 #Start of the parentesis
end=-1 #End of the parentesis.
tokens=list(expression) #Splitted expression
r=range(len(tokens))
r.reverse()
lev_non_zero_chars=0 #Number of chars inside parentesis
for i in r: #Parses expression from end to begin, to preserve operation's order
if tokens[i]==u"(":
if level==0:
start=i
print start
level+=1
elif tokens[i]==u")":
level-=1
if level==0:
end=i
print end
if level!=0:
lev_non_zero_chars+=1
if i==0 and level==0 and tokens[i] in unary: #Unary operator found, must grab its parameters and its child relation they
child=""
for q in tokens[start+1:end]:
child+=q
self.name= tokens[i]
print "-----",tokens[i]
print "---",start,end,lev_non_zero_chars
print child
#print prop
#self.child=node(child)
if level==0 and tokens[i] in binary: #Binary operator found, everything on left will go in the left subree and everhthing on the right will go in the right subtree
self.kind=BINARY
left=""
right=""
if start==end==-1:#No parentesis before
end=i
for q in tokens[start+1:end]:
left+=q
self.name= tokens[i]
for q in tokens[i+1:]:
right+=q
print "self: ",tokens[i]
print "left: ",left
print "right:" ,right
self.left=node(left)
self.right=node(right)
return
if lev_non_zero_chars!=0 and lev_non_zero_chars+1==len(expression):#Expression is entirely contained in parentesis, removing them
n=node(expression[1:-1])
self.name=n.name
self.kind=n.kind
if n.kind==UNARY:
self.child=n.child
elif n.kind==BINARY:
self.left=n.left
self.right=n.right
self.prop=n.prop
return
self.kind=RELATION
self.name=expression
def __str__(self): def __str__(self):
if (self.kind==RELATION): if (self.kind==RELATION):
@ -207,6 +129,11 @@ def tokenize(expression):
return items return items
def tree(expression):
'''This function parses a relational algebra expression into a tree and returns
the root node using the Node class defined in this module.'''
#isinstance(k,list)
pass
if __name__=="__main__": if __name__=="__main__":
#n=node(u"((a b) - c d) - b") #n=node(u"((a b) - c d) - b")