Advertisement
Guest User

Code

a guest
Apr 10th, 2016
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.14 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import nodes
  4.  
  5. asts = []
  6.  
  7. class AST(object):
  8.     END_CHARS = ")(r"
  9.     RECURSE = "RECURSE"
  10.     def setup(self, code, first = False):
  11.         if first: asts[:] = []
  12.         asts.append(self)
  13.         self.first = first
  14.         self.nodes = []
  15.         while code != "" and (self.first or code[0] not in AST.END_CHARS):
  16.             code, node = AST.add_node(code)
  17.             self.nodes.append(node)
  18.         #print self.nodes
  19.         if code != "":
  20.             if code[0] == "r":
  21.                 self.nodes.append(AST.RECURSE)
  22.             if code[0] != "(":
  23.                 code = code[1:]
  24.         return code
  25.    
  26.     def run(self, stack = None):
  27.         if stack == None:
  28.             self.stack = []
  29.         else:
  30.             self.stack = stack
  31.         self.counter = 0
  32.         while self.counter != len(self.nodes):
  33.             cur_node = self.nodes[self.counter]
  34.             if cur_node is AST.RECURSE:
  35.                 self.recurse()
  36.                 return self.stack
  37.             #print(cur_node, stack)
  38.             cur_node.prepare(self.stack)
  39.             no_args = cur_node.args
  40.             self.stack, args = self.stack[no_args:], self.stack[:no_args]
  41.             self.stack = cur_node(args) + self.stack
  42.             self.counter += 1
  43.         return self.stack
  44.        
  45.     @staticmethod
  46.     def add_node(code):
  47.         accepting = []
  48.         for name in nodes.nodes:
  49.             node = nodes.nodes[name]
  50.             new_code, new_node = node.accepts(code)
  51.             if new_code is not None:
  52.                 assert(new_node is not None)
  53.                 accepting.append((node.char, new_code, new_node))
  54.         if accepting == []:
  55.             raise SyntaxError("No nodes will accept code: %r"%(code))
  56.         return sorted(accepting, key = lambda i:len(i[0]))[0][1:]
  57.    
  58.     def recurse(self):
  59.         for ast in asts[::-1]:
  60.             ast.counter = len(ast.nodes)-1
  61.         assert(ast.first)
  62.         ast.stack = self.stack
  63.         ast.counter = 0
  64.      
  65. def test_code(code, out_stack):
  66.     ast = AST()
  67.     ast.setup(code, first = True)
  68.     rtn_stack = ast.run()
  69.     assert(rtn_stack == out_stack)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement