[pypy-svn] r12753 - pypy/dist/pypy/module/recparser

ludal at codespeak.net ludal at codespeak.net
Mon May 23 20:05:24 CEST 2005


Author: ludal
Date: Mon May 23 20:05:24 2005
New Revision: 12753

Added:
   pypy/dist/pypy/module/recparser/tuplebuilder.py
Log:
 * a builder that builds directly a tuple tree bypassing the syntax tree


Added: pypy/dist/pypy/module/recparser/tuplebuilder.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/module/recparser/tuplebuilder.py	Mon May 23 20:05:24 2005
@@ -0,0 +1,61 @@
+
+from grammar import BaseGrammarBuilder
+from syntaxtree import TOKEN_MAP, SYMBOLS, NT_OFFSET
+
+
+def _expand_nodes( nodes ):
+    expanded = []
+    for n in nodes:
+        if n[0]==-2:
+            expanded.extend( expand_nodes(n[1:]) )
+        else:
+            expanded.append(n)
+    return tuple(expanded)
+
+def expand_nodes( nodes ):
+    r = _expand_nodes( nodes )
+    for n in nodes:
+        assert type(n[0])==int
+    return r
+        
+class TupleBuilder(BaseGrammarBuilder):
+    """A builder that directly produce the AST"""
+
+    def __init__( self, rules=None, debug=0, lineno=False ):
+        BaseGrammarBuilder.__init__(self, rules, debug )
+        self.lineno = True
+
+    def alternative( self, rule, source ):
+        # Do nothing, keep rule on top of the stack
+        if rule.is_root():
+            node = [ SYMBOLS.get( rule.name, (0,rule.name) ) ]
+            node +=  expand_nodes( [self.stack[-1]] )
+            self.stack[-1] = tuple(node)
+        return True
+
+    def sequence(self, rule, source, elts_number):
+        """ """
+        if rule.is_root():
+            node  = [ SYMBOLS.get( rule.name, (0,rule.name) ) ]
+        else:
+            node = [ -2 ]
+        if elts_number>0:
+            node += expand_nodes( self.stack[-elts_number:] )
+            self.stack[-elts_number:] = [tuple(node)]
+        else:
+            self.stack.append( tuple(node) )
+        return True
+
+    def token(self, name, value, source):
+        num = TOKEN_MAP.get( name, -1)
+        lineno = source.current_line()
+        if value is None:
+            if name not in ("NEWLINE", "INDENT", "DEDENT", "ENDMARKER"):
+                value = name
+            else:
+                value = ''
+        if self.lineno:
+            self.stack.append( (num, value, lineno) )
+        else:
+            self.stack.append( (num, value) )
+        return True



More information about the Pypy-commit mailing list