Add support for // and //=.
authorJeremy Hylton <jeremy@alum.mit.edu>
Wed, 29 Aug 2001 18:12:30 +0000 (18:12 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Wed, 29 Aug 2001 18:12:30 +0000 (18:12 +0000)
Avoid if/elif/elif/else tests where the final else is supposed to
handle exactly one case instead of all other cases.  When the list of
operators is extended, the catchall else treats all new operators as
the last operator in the set of tests.  Instead, raise an exception if
an unexpected operator occurs.

Lib/compiler/transformer.py
Tools/compiler/compiler/transformer.py

index 7f615958daba449ad51370ae26cf25f5f52468da..323aa20218ff76e727741d57e6463135fcbbee92 100644 (file)
@@ -588,9 +588,11 @@ class Transformer:
             if nodelist[i-1][0] == token.LEFTSHIFT:
                 node = LeftShift([node, right])
                 node.lineno = nodelist[1][2]
-            else:
+            elif nodelist[i-1][0] == token.RIGHTSHIFT:
                 node = RightShift([node, right])
                 node.lineno = nodelist[1][2]
+            else:
+                raise ValueError, "unexpected token: %s" % nodelist[i-1][0]
         return node
 
     def arith_expr(self, nodelist):
@@ -600,9 +602,11 @@ class Transformer:
             if nodelist[i-1][0] == token.PLUS:
                 node = Add([node, right])
                 node.lineno = nodelist[1][2]
-            else:
+            elif nodelist[i-1][0] == token.MINUS:
                 node = Sub([node, right])
                 node.lineno = nodelist[1][2]
+            else:
+                raise ValueError, "unexpected token: %s" % nodelist[i-1][0]
         return node
 
     def term(self, nodelist):
@@ -614,8 +618,12 @@ class Transformer:
                 node = Mul([node, right])
             elif t == token.SLASH:
                 node = Div([node, right])
-            else:
+            elif t == token.PERCENT:
                 node = Mod([node, right])
+            elif t == token.DOUBLESLASH:
+                node = FloorDiv([node, right])
+            else:
+                raise ValueError, "unexpected token: %s" % t
             node.lineno = nodelist[1][2]
         return node
 
@@ -750,10 +758,13 @@ class Transformer:
 
                 if i < len(nodelist):
                     # should be DOUBLESTAR or STAR STAR
-                    if nodelist[i][0] == token.DOUBLESTAR:
+                    t = nodelist[i][0]
+                    if t == token.DOUBLESTAR:
                         node = nodelist[i+1]
-                    else:
+                    elif t == token.STARSTAR:
                         node = nodelist[i+2]
+                    else:
+                        raise ValueError, "unexpected token: %s" % t
                     names.append(node[1])
                     flags = flags | CO_VARKEYWORDS
 
index 7f615958daba449ad51370ae26cf25f5f52468da..323aa20218ff76e727741d57e6463135fcbbee92 100644 (file)
@@ -588,9 +588,11 @@ class Transformer:
             if nodelist[i-1][0] == token.LEFTSHIFT:
                 node = LeftShift([node, right])
                 node.lineno = nodelist[1][2]
-            else:
+            elif nodelist[i-1][0] == token.RIGHTSHIFT:
                 node = RightShift([node, right])
                 node.lineno = nodelist[1][2]
+            else:
+                raise ValueError, "unexpected token: %s" % nodelist[i-1][0]
         return node
 
     def arith_expr(self, nodelist):
@@ -600,9 +602,11 @@ class Transformer:
             if nodelist[i-1][0] == token.PLUS:
                 node = Add([node, right])
                 node.lineno = nodelist[1][2]
-            else:
+            elif nodelist[i-1][0] == token.MINUS:
                 node = Sub([node, right])
                 node.lineno = nodelist[1][2]
+            else:
+                raise ValueError, "unexpected token: %s" % nodelist[i-1][0]
         return node
 
     def term(self, nodelist):
@@ -614,8 +618,12 @@ class Transformer:
                 node = Mul([node, right])
             elif t == token.SLASH:
                 node = Div([node, right])
-            else:
+            elif t == token.PERCENT:
                 node = Mod([node, right])
+            elif t == token.DOUBLESLASH:
+                node = FloorDiv([node, right])
+            else:
+                raise ValueError, "unexpected token: %s" % t
             node.lineno = nodelist[1][2]
         return node
 
@@ -750,10 +758,13 @@ class Transformer:
 
                 if i < len(nodelist):
                     # should be DOUBLESTAR or STAR STAR
-                    if nodelist[i][0] == token.DOUBLESTAR:
+                    t = nodelist[i][0]
+                    if t == token.DOUBLESTAR:
                         node = nodelist[i+1]
-                    else:
+                    elif t == token.STARSTAR:
                         node = nodelist[i+2]
+                    else:
+                        raise ValueError, "unexpected token: %s" % t
                     names.append(node[1])
                     flags = flags | CO_VARKEYWORDS