1
"""SyntaxTree class definition"""
3
# # from pypy.interpreter.pyparser.pysymbol import sym_values
4
# from pypy.interpreter.pyparser.pytoken import tok_values
6
# # from pysymbol import sym_values
7
# from pytoken import tok_values
9
from pypy.tool.uid import uid
11
from pypy.tool.uid import uid
13
class AbstractSyntaxVisitor(object):
14
def visit_syntaxnode( self, node ):
17
def visit_tempsyntaxnode( self, node ):
20
def visit_tokennode( self, node ):
23
class SyntaxNode(object):
25
def __init__(self, name, args, lineno=-1):
30
def dumptree(self, treenodes, indent):
31
"""helper function used to dump the syntax tree"""
32
treenodes.append(str(self.name))
33
if len(self.nodes) > 1:
34
treenodes.append(" -> (\n")
35
treenodes.append(indent+" ")
36
for node in self.nodes:
37
node.dumptree(treenodes, indent+" ")
38
treenodes.append(")\n")
39
treenodes.append(indent)
40
elif len(self.nodes) == 1:
41
treenodes.append(" ->\n")
42
treenodes.append(indent+" ")
43
self.nodes[0].dumptree(treenodes, indent+" ")
46
"""turns the tree repr into a string"""
48
self.dumptree(treenodes, "")
49
return "".join(treenodes)
52
return "<node [%s] at 0x%x>" % (self.name, uid(self))
55
return "(%s)" % self.name
57
def visit(self, visitor):
58
assert isinstance(visitor, AbstractSyntaxVisitor)
59
return visitor.visit_syntaxnode(self)
62
"""expand the syntax node to its content,
63
do nothing here since we are a regular node and not
67
def totuple(self, sym_values, lineno=False ):
68
"""returns a tuple representation of the syntax tree
69
needs symbols+tokens value to name mapping to represent the nodes
71
symvalue = sym_values.get( self.name, (0, self.name) )
73
l += [node.totuple(lineno, sym_values ) for node in self.nodes]
77
class TempSyntaxNode(SyntaxNode):
78
"""A temporary syntax node to represent intermediate rules"""
80
"""expand the syntax node to its content"""
83
def visit(self, visitor):
84
assert isinstance(visitor, AbstractSyntaxVisitor)
85
return visitor.visit_tempsyntaxnode(self)
87
class TokenNode(SyntaxNode):
89
def __init__(self, name, value, lineno = -1):
90
SyntaxNode.__init__(self, name, [], lineno)
93
def dumptree(self, treenodes, indent):
94
"""helper function used to dump the syntax tree"""
96
treenodes.append("%s='%s' (%d) " % (self.name, self.value,
99
treenodes.append("'%s' (%d) " % (self.name, self.lineno))
102
if self.value is not None:
103
return "<%s=%s>" % ( self.name, repr(self.value))
105
return "<%s!>" % (self.name,)
107
def visit(self, visitor):
108
assert isinstance(visitor, AbstractSyntaxVisitor)
109
return visitor.visit_tokennode(self)
111
def totuple(self, tok_values, lineno=False):
112
"""returns a tuple representation of the syntax tree
113
needs symbols+tokens value to name mapping to represent the nodes
115
num = tok_values.get(self.name, -1)
117
print "Unknown", self.name, self.value
118
if self.value is not None:
121
if self.name not in ("NEWLINE", "INDENT", "DEDENT", "ENDMARKER"):
124
val = self.value or ''
126
return (num, val, self.lineno)