]> granicus.if.org Git - python/commitdiff
Update the parser module to support augmented assignment.
authorFred Drake <fdrake@acm.org>
Fri, 25 Aug 2000 22:42:40 +0000 (22:42 +0000)
committerFred Drake <fdrake@acm.org>
Fri, 25 Aug 2000 22:42:40 +0000 (22:42 +0000)
Add some test cases.

Lib/test/output/test_parser
Lib/test/test_parser.py
Modules/parsermodule.c

index c5b6777babe400b7445127b6e19e2e7ed000a8c0..86ec22d08e610359ae13d1d481bd2bfa0897bbb0 100644 (file)
@@ -1,28 +1,42 @@
 test_parser
 Expressions:
-foo(1)
-[1, 2, 3]
-[x**3 for x in range(20)]
-[x**3 for x in range(20) if x % 3]
-foo(*args)
-foo(*args, **kw)
-foo(**kw)
-foo(key=value)
-foo(key=value, *args)
-foo(key=value, *args, **kw)
-foo(key=value, **kw)
-foo(a, b, c, *args)
-foo(a, b, c, *args, **kw)
-foo(a, b, c, **kw)
-foo + bar
+expr: foo(1)
+expr: [1, 2, 3]
+expr: [x**3 for x in range(20)]
+expr: [x**3 for x in range(20) if x % 3]
+expr: foo(*args)
+expr: foo(*args, **kw)
+expr: foo(**kw)
+expr: foo(key=value)
+expr: foo(key=value, *args)
+expr: foo(key=value, *args, **kw)
+expr: foo(key=value, **kw)
+expr: foo(a, b, c, *args)
+expr: foo(a, b, c, *args, **kw)
+expr: foo(a, b, c, **kw)
+expr: foo + bar
 
 Statements:
-print
-print 1
-print 1,
-print >>fp
-print >>fp, 1
-print >>fp, 1,
+suite: print
+suite: print 1
+suite: print 1,
+suite: print >>fp
+suite: print >>fp, 1
+suite: print >>fp, 1,
+suite: a
+suite: a = b
+suite: a = b = c = d = e
+suite: a += b
+suite: a -= b
+suite: a *= b
+suite: a /= b
+suite: a %= b
+suite: a &= b
+suite: a |= b
+suite: a ^= b
+suite: a <<= b
+suite: a >>= b
+suite: a **= b
 
 Invalid parse trees:
 
@@ -34,3 +48,6 @@ caught expected exception for invalid tree
 
 a,,c
 caught expected exception for invalid tree
+
+a $= b
+caught expected exception for invalid tree
index 559a0f4b9bad5aaacbb0ee49cdc21987fb49bd9f..bc41de42676465df8372fca3971b19f715038e19 100644 (file)
@@ -1,3 +1,4 @@
+import os.path
 import parser
 import pprint
 import sys
@@ -12,38 +13,68 @@ from test_support import verbose
 #
 
 def roundtrip(f, s):
-    print s
     st1 = f(s)
     t = st1.totuple()
     st2 = parser.sequence2ast(t)
 
+def roundtrip_fromfile(filename):
+    roundtrip(suite, open(filename).read())
+
+def test_expr(s):
+    print "expr:", s
+    roundtrip(expr, s)
+
+def test_suite(s):
+    print "suite:", s
+    roundtrip(suite, s)
+
 
 print "Expressions:"
 
-roundtrip(expr, "foo(1)")
-roundtrip(expr, "[1, 2, 3]")
-roundtrip(expr, "[x**3 for x in range(20)]")
-roundtrip(expr, "[x**3 for x in range(20) if x % 3]")
-roundtrip(expr, "foo(*args)")
-roundtrip(expr, "foo(*args, **kw)")
-roundtrip(expr, "foo(**kw)")
-roundtrip(expr, "foo(key=value)")
-roundtrip(expr, "foo(key=value, *args)")
-roundtrip(expr, "foo(key=value, *args, **kw)")
-roundtrip(expr, "foo(key=value, **kw)")
-roundtrip(expr, "foo(a, b, c, *args)")
-roundtrip(expr, "foo(a, b, c, *args, **kw)")
-roundtrip(expr, "foo(a, b, c, **kw)")
-roundtrip(expr, "foo + bar")
+test_expr("foo(1)")
+test_expr("[1, 2, 3]")
+test_expr("[x**3 for x in range(20)]")
+test_expr("[x**3 for x in range(20) if x % 3]")
+test_expr("foo(*args)")
+test_expr("foo(*args, **kw)")
+test_expr("foo(**kw)")
+test_expr("foo(key=value)")
+test_expr("foo(key=value, *args)")
+test_expr("foo(key=value, *args, **kw)")
+test_expr("foo(key=value, **kw)")
+test_expr("foo(a, b, c, *args)")
+test_expr("foo(a, b, c, *args, **kw)")
+test_expr("foo(a, b, c, **kw)")
+test_expr("foo + bar")
 
 print
 print "Statements:"
-roundtrip(suite, "print")
-roundtrip(suite, "print 1")
-roundtrip(suite, "print 1,")
-roundtrip(suite, "print >>fp")
-roundtrip(suite, "print >>fp, 1")
-roundtrip(suite, "print >>fp, 1,")
+test_suite("print")
+test_suite("print 1")
+test_suite("print 1,")
+test_suite("print >>fp")
+test_suite("print >>fp, 1")
+test_suite("print >>fp, 1,")
+
+# expr_stmt
+test_suite("a")
+test_suite("a = b")
+test_suite("a = b = c = d = e")
+test_suite("a += b")
+test_suite("a -= b")
+test_suite("a *= b")
+test_suite("a /= b")
+test_suite("a %= b")
+test_suite("a &= b")
+test_suite("a |= b")
+test_suite("a ^= b")
+test_suite("a <<= b")
+test_suite("a >>= b")
+test_suite("a **= b")
+
+#d = os.path.dirname(os.__file__)
+#roundtrip_fromfile(os.path.join(d, "os.py"))
+#roundtrip_fromfile(os.path.join(d, "test", "test_parser.py"))
 
 #
 #  Second, we take *invalid* trees and make sure we get ParserError
@@ -114,3 +145,34 @@ tree = \
  (0, ''))
 
 check_bad_tree(tree, "a,,c")
+
+# a $= b
+tree = \
+(257,
+ (264,
+  (265,
+   (266,
+    (267,
+     (312,
+      (291,
+       (292,
+        (293,
+         (294,
+          (296,
+           (297,
+            (298,
+             (299, (300, (301, (302, (303, (304, (1, 'a'))))))))))))))),
+     (268, (37, '$=')),
+     (312,
+      (291,
+       (292,
+        (293,
+         (294,
+          (296,
+           (297,
+            (298,
+             (299, (300, (301, (302, (303, (304, (1, 'b'))))))))))))))))),
+   (4, ''))),
+ (0, ''))
+
+check_bad_tree(tree, "a $= b")
index ef8ec9bcf60f5ec84ed2773ed4bf1e59e3fdd3db..50161cffedff8e5df37df20c6259aa2d64d54312 100644 (file)
@@ -1467,10 +1467,34 @@ validate_expr_stmt(node *tree)
                && is_odd(nch)
                && validate_testlist(CHILD(tree, 0)));
 
-    for (j = 1; res && (j < nch); j += 2)
-        res = (validate_equal(CHILD(tree, j))
-               && validate_testlist(CHILD(tree, j + 1)));
+    if (res && nch == 3
+        && TYPE(CHILD(tree, 1)) == augassign) {
+        res = (validate_numnodes(CHILD(tree, 1), 1, "augassign")
+               && validate_testlist(CHILD(tree, 2)));
 
+        if (res) {
+            char *s = STR(CHILD(CHILD(tree, 1), 0));
+
+            res = (strcmp(s, "+=") == 0
+                   || strcmp(s, "-=") == 0
+                   || strcmp(s, "*=") == 0
+                   || strcmp(s, "/=") == 0
+                   || strcmp(s, "%=") == 0
+                   || strcmp(s, "&=") == 0
+                   || strcmp(s, "|=") == 0
+                   || strcmp(s, "^=") == 0
+                   || strcmp(s, "<<=") == 0
+                   || strcmp(s, ">>=") == 0
+                   || strcmp(s, "**=") == 0);
+            if (!res)
+                err_string("illegal augmmented assignment operator");
+        }
+    }
+    else {
+        for (j = 1; res && (j < nch); j += 2)
+            res = (validate_equal(CHILD(tree, j))
+                   && validate_testlist(CHILD(tree, j + 1)));
+    }
     return (res);
 }
 
@@ -2822,9 +2846,11 @@ static PyMethodDef parser_functions[] =  {
     };
 
 
+DL_IMPORT(void) initparser(void);
+
 DL_EXPORT(void)
 initparser(void)
- {
+{
     PyObject* module;
     PyObject* dict;
         
@@ -2834,8 +2860,6 @@ initparser(void)
 
     if (parser_error == 0)
         parser_error = PyErr_NewException("parser.ParserError", NULL, NULL);
-    else
-        puts("parser module initialized more than once!");
 
     if ((parser_error == 0)
         || (PyDict_SetItemString(dict, "ParserError", parser_error) != 0)) {