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
|