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
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):
'''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):
expression=expression.strip()
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
pass
def __str__(self):
if (self.kind==RELATION):
@ -207,6 +129,11 @@ def tokenize(expression):
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__":
#n=node(u"((a b) - c d) - b")