| 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
|