diff options
Diffstat (limited to 'toolkit/src2xml/source/expression.py')
-rw-r--r-- | toolkit/src2xml/source/expression.py | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/toolkit/src2xml/source/expression.py b/toolkit/src2xml/source/expression.py new file mode 100644 index 000000000000..b5f58c42d112 --- /dev/null +++ b/toolkit/src2xml/source/expression.py @@ -0,0 +1,111 @@ + +import sys +import globals + +def toString (node): + + if node == None: + return '' + + chars = '(' + + if type(node.left) == type(0): + chars += "%d"%node.left + else: + chars += toString(node.left) + + chars += node.op + + if type(node.right) == type(0): + chars += "%d"%node.right + else: + chars += toString(node.right) + + chars += ")" + + return chars + +class Node(object): + def __init__ (self): + self.left = None + self.right = None + self.parent = None + self.op = None + +class ExpParser(object): + + def __init__ (self, tokens): + self.tokens = tokens + + def jumpToRoot (self): + while self.ptr.parent != None: + self.ptr = self.ptr.parent + + def build (self): + self.ptr = Node() + + for token in self.tokens: + + if token in '+-': + if self.ptr.left == None: + raise globals.ParseError ('') + if self.ptr.right == None: + self.ptr.op = token + else: + self.jumpToRoot() + self.ptr.parent = Node() + self.ptr.parent.left = self.ptr + self.ptr = self.ptr.parent + self.ptr.op = token + + elif token in '*/': + if self.ptr.left == None: + raise globals.ParseError ('') + elif self.ptr.right == None: + self.ptr.op = token + else: + num = self.ptr.right + self.ptr.right = Node() + self.ptr.right.parent = self.ptr + self.ptr.right.left = num + self.ptr.right.op = token + self.ptr = self.ptr.right + + elif token == '(': + if self.ptr.left == None: + self.ptr.left = Node() + self.ptr.left.parent = self.ptr + self.ptr = self.ptr.left + elif self.ptr.right == None: + self.ptr.right = Node() + self.ptr.right.parent = self.ptr + self.ptr = self.ptr.right + else: + raise globals.ParseError ('') + + elif token == ')': + if self.ptr.left == None: + raise globals.ParseError ('') + elif self.ptr.right == None: + raise globals.ParseError ('') + elif self.ptr.parent == None: + pass + else: + self.ptr = self.ptr.parent + + else: + num = int(token) + if self.ptr.left == None: + self.ptr.left = num + elif self.ptr.right == None: + self.ptr.right = num + else: + raise globals.ParseError ('') + + def dumpTree (self): + self.jumpToRoot() + print toString(self.ptr) + + + + |