[pypy-svn] r22583 - pypy/branch/ast-experiments/pypy/interpreter/pyparser

ludal at codespeak.net ludal at codespeak.net
Tue Jan 24 13:18:02 CET 2006


Author: ludal
Date: Tue Jan 24 13:18:01 2006
New Revision: 22583

Modified:
   pypy/branch/ast-experiments/pypy/interpreter/pyparser/ebnfparse.py
Log:
bugfixes


Modified: pypy/branch/ast-experiments/pypy/interpreter/pyparser/ebnfparse.py
==============================================================================
--- pypy/branch/ast-experiments/pypy/interpreter/pyparser/ebnfparse.py	(original)
+++ pypy/branch/ast-experiments/pypy/interpreter/pyparser/ebnfparse.py	Tue Jan 24 13:18:01 2006
@@ -27,14 +27,14 @@
         return False
     for c in name:
         v = ord(c)
-        if not (ORDA <= v <= ORDZ or 
+        if not (ORDA <= v <= ORDZ or
                 ORDa <= v <= ORDz or
                 ORD0 <= v <= ORD9 or
                 v == ORD_ ):
             return False
     return True
-        
-            
+
+
 
 punct=['>=', '<>', '!=', '<', '>', '<=', '==', '\\*=',
        '//=', '%=', '^=', '<<=', '\\*\\*=', '\\', '=',
@@ -79,7 +79,7 @@
                 return self.debug_return( ret, tk.codename, tk.value )
         source.restore( ctx )
         return 0
-        
+
     def match_token(self, other):
         """special case of match token for tokens which are really keywords
         """
@@ -214,7 +214,6 @@
         AbstractBuilder.__init__(self, rules, debug, symbols)
         self.rule_stack = []
         self.root_rules = {}
-        self.keywords = []
         self.seqcounts = [] # number of items in the current sequence
         self.altcounts = [] # number of sequence in the current alternative
         self.curaltcount = 0
@@ -223,8 +222,12 @@
         self.current_rule = -1
         self.all_rules = []
         self.tokens = {}
+        self.keywords = []
+        self.tokens[pytoken.NAME] = NameToken(keywords=self.keywords)
 
     def new_symbol(self):
+        """Allocate and return a new (anonymous) grammar symbol whose
+        name is based on the current grammar rule being parsed"""
         current_rule_name = self.symbols.sym_name.get(self.current_rule,"x")
         rule_name = ":" + current_rule_name + "_%d" % self.current_subrule
         self.current_subrule += 1
@@ -232,6 +235,7 @@
         return symval
 
     def new_rule(self, rule):
+        """A simple helper method that registers a new rule as 'known'"""
         self.all_rules.append(rule)
         return rule
 
@@ -255,6 +259,7 @@
             del self.root_rules[codename]
 
     def get_token(self, codename ):
+        """Returns a new or existing token"""
         if codename in self.tokens:
             return self.tokens[codename]
         token = self.tokens[codename] = Token(codename)
@@ -324,17 +329,26 @@
             self.curseqcount += 1
         elif _rule == ebnfgrammar.option:
 #            print "  -option", self.curaltcount, self.curseqcount
+            # pops the last alternative
+            rules = self.pop_rules( 1 )
+            new_rule = self.new_rule(KleeneStar( self.new_symbol(), _min=0, _max=1, rule=rules[0] ))
+            self.rule_stack.append( new_rule )
             self.curseqcount += 1
         elif _rule == ebnfgrammar.rule:
 #            print "  -rule", self.curaltcount, self.curseqcount
             assert len(self.rule_stack)==1
             old_rule = self.rule_stack[0]
             del self.rule_stack[0]
-            old_rule.codename = self.current_rule
+            if isinstance(old_rule,Token):
+                # Wrap a token into an alternative
+                old_rule = self.new_rule(Alternative( self.current_rule, [old_rule] ))
+            else:
+                # Make sure we use the codename from the named rule
+                old_rule.codename = self.current_rule
             self.root_rules[self.current_rule] = old_rule
             self.current_subrule = 0
         return True
-    
+
     def token(self, name, value, source):
 #        print "token", name, value
         if name == ebnfgrammar.TOK_STRING:



More information about the Pypy-commit mailing list