summaryrefslogtreecommitdiff
path: root/Lib/test/test_parser.py
blob: 559a0f4b9bad5aaacbb0ee49cdc21987fb49bd9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import parser
import pprint
import sys

from parser import expr, suite, sequence2ast
from test_support import verbose

#
#  First, we test that we can generate trees from valid source fragments,
#  and that these valid trees are indeed allowed by the tree-loading side
#  of the parser module.
#

def roundtrip(f, s):
    print s
    st1 = f(s)
    t = st1.totuple()
    st2 = parser.sequence2ast(t)


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")

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,")

#
#  Second, we take *invalid* trees and make sure we get ParserError
#  rejections for them.
#

print
print "Invalid parse trees:"

def check_bad_tree(tree, label):
    print
    print label
    try:
        sequence2ast(tree)
    except parser.ParserError:
        print "caught expected exception for invalid tree"
        pass
    else:
        print "test failed: did not properly detect invalid tree:"
        pprint.pprint(tree)


# not even remotely valid:
check_bad_tree((1, 2, 3), "<junk>")

# print >>fp,
tree = \
(257,
 (264,
  (265,
   (266,
    (268,
     (1, 'print'),
     (35, '>>'),
     (290,
      (291,
       (292,
        (293,
         (295,
          (296,
           (297,
            (298, (299, (300, (301, (302, (303, (1, 'fp')))))))))))))),
     (12, ','))),
   (4, ''))),
 (0, ''))

check_bad_tree(tree, "print >>fp,")

# a,,c
tree = \
(258,
 (311,
  (290,
   (291,
    (292,
     (293,
      (295,
       (296, (297, (298, (299, (300, (301, (302, (303, (1, 'a')))))))))))))),
  (12, ','),
  (12, ','),
  (290,
   (291,
    (292,
     (293,
      (295,
       (296, (297, (298, (299, (300, (301, (302, (303, (1, 'c'))))))))))))))),
 (4, ''),
 (0, ''))

check_bad_tree(tree, "a,,c")