| 1 | #!/usr/bin/env python2
 | 
| 2 | """
 | 
| 3 | pnode.py
 | 
| 4 | """
 | 
| 5 | from __future__ import print_function
 | 
| 6 | 
 | 
| 7 | from typing import TYPE_CHECKING, Optional, List
 | 
| 8 | 
 | 
| 9 | if TYPE_CHECKING:
 | 
| 10 |   from _devbuild.gen.syntax_asdl import Token
 | 
| 11 | 
 | 
| 12 | 
 | 
| 13 | class PNode(object):
 | 
| 14 |   __slots__ = ('typ', 'tok', 'children')
 | 
| 15 | 
 | 
| 16 |   def __init__(self, typ, tok, children):
 | 
| 17 |     # type: (int, Optional[Token], Optional[List[PNode]]) -> None
 | 
| 18 |     self.typ = typ  # token or non-terminal
 | 
| 19 |     self.tok = tok  # In Oil, this is syntax_asdl.Token.  In OPy, it's a
 | 
| 20 |                     # 3-tuple (val, prefix, loc)
 | 
| 21 |                     # NOTE: This is None for the first entry in the stack?
 | 
| 22 |     self.children = children
 | 
| 23 | 
 | 
| 24 |   def __repr__(self):
 | 
| 25 |     # type: () -> str
 | 
| 26 |     tok_str = str(self.tok) if self.tok else '-'
 | 
| 27 |     ch_str = 'with %d children' % len(self.children) \
 | 
| 28 |         if self.children is not None else ''
 | 
| 29 |     return '(PNode %s %s %s)' % (self.typ, tok_str, ch_str)
 | 
| 30 | 
 | 
| 31 |   def AddChild(self, node):
 | 
| 32 |     # type: (PNode) -> None
 | 
| 33 |     """
 | 
| 34 |     Add `node` as a child.
 | 
| 35 |     """
 | 
| 36 |     self.children.append(node)
 | 
| 37 | 
 | 
| 38 |   def GetChild(self, i):
 | 
| 39 |     # type: (int) -> PNode
 | 
| 40 |     """
 | 
| 41 |     Returns the `i`th uncomsumed child.
 | 
| 42 |     """
 | 
| 43 |     if i < 0:
 | 
| 44 |       return self.children[i]
 | 
| 45 | 
 | 
| 46 |     return self.children[i]
 | 
| 47 | 
 | 
| 48 |   def NumChildren(self):
 | 
| 49 |     # type: () -> int
 | 
| 50 |     """
 | 
| 51 |     Returns the number of unconsumed children.
 | 
| 52 |     """
 | 
| 53 |     return len(self.children)
 | 
| 54 | 
 | 
| 55 | 
 | 
| 56 | class PNodeAllocator(object):
 | 
| 57 |   def __init__(self):
 | 
| 58 |     # type: () -> None
 | 
| 59 |     return
 | 
| 60 | 
 | 
| 61 |   def NewPNode(self, typ, tok):
 | 
| 62 |     # type: (int, Optional[Token]) -> PNode
 | 
| 63 |     return PNode(typ, tok, [])
 | 
| 64 | 
 | 
| 65 |   def Clear(self):
 | 
| 66 |     # type: () -> None
 | 
| 67 |     return
 |