Mercurial > cpython-lru_cache-weakref
annotate Parser/asdl.py @ 78069:a8aa77458e12 3.2
Add c_size_t and c_ssize_t to the ctypes summary table.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Thu, 12 Jul 2012 20:31:50 +0200 |
| parents | 197511c4b75a |
| children | 0daa6ba25d9b |
| rev | line source |
|---|---|
| 35742 | 1 """An implementation of the Zephyr Abstract Syntax Definition Language. |
| 2 | |
| 3 See http://asdl.sourceforge.net/ and | |
|
61690
197511c4b75a
Merged revisions 81286 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents:
55606
diff
changeset
|
4 http://www.cs.princeton.edu/research/techreps/TR-554-97 |
| 35742 | 5 |
| 6 Only supports top level module decl, not view. I'm guessing that view | |
| 7 is intended to support the browser and I'm not interested in the | |
| 8 browser. | |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
9 |
|
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
10 Changes for Python: Add support for module versions |
| 35742 | 11 """ |
| 12 | |
| 13 import os | |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
14 import sys |
| 35742 | 15 import traceback |
| 16 | |
| 17 import spark | |
| 18 | |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
19 def output(string): |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
20 sys.stdout.write(string + "\n") |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
21 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
22 |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
23 class Token(object): |
| 35742 | 24 # spark seems to dispatch in the parser based on a token's |
| 25 # type attribute | |
| 26 def __init__(self, type, lineno): | |
| 27 self.type = type | |
| 28 self.lineno = lineno | |
| 29 | |
| 30 def __str__(self): | |
| 31 return self.type | |
| 32 | |
| 33 def __repr__(self): | |
| 34 return str(self) | |
| 35 | |
| 36 class Id(Token): | |
| 37 def __init__(self, value, lineno): | |
| 38 self.type = 'Id' | |
| 39 self.value = value | |
| 40 self.lineno = lineno | |
| 41 | |
| 42 def __str__(self): | |
| 43 return self.value | |
|
36721
f7b4726ada6c
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
36703
diff
changeset
|
44 |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
45 class String(Token): |
|
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
46 def __init__(self, value, lineno): |
|
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
47 self.type = 'String' |
|
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
48 self.value = value |
|
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
49 self.lineno = lineno |
| 35742 | 50 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
51 class ASDLSyntaxError(Exception): |
| 35742 | 52 |
| 53 def __init__(self, lineno, token=None, msg=None): | |
| 54 self.lineno = lineno | |
| 55 self.token = token | |
| 56 self.msg = msg | |
| 57 | |
| 58 def __str__(self): | |
| 59 if self.msg is None: | |
| 60 return "Error at '%s', line %d" % (self.token, self.lineno) | |
| 61 else: | |
| 62 return "%s, line %d" % (self.msg, self.lineno) | |
| 63 | |
| 64 class ASDLScanner(spark.GenericScanner, object): | |
| 65 | |
| 66 def tokenize(self, input): | |
| 67 self.rv = [] | |
| 68 self.lineno = 1 | |
| 69 super(ASDLScanner, self).tokenize(input) | |
| 70 return self.rv | |
| 71 | |
| 72 def t_id(self, s): | |
| 73 r"[\w\.]+" | |
| 74 # XXX doesn't distinguish upper vs. lower, which is | |
| 75 # significant for ASDL. | |
| 76 self.rv.append(Id(s, self.lineno)) | |
|
36721
f7b4726ada6c
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
36703
diff
changeset
|
77 |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
78 def t_string(self, s): |
|
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
79 r'"[^"]*"' |
|
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
80 self.rv.append(String(s, self.lineno)) |
| 35742 | 81 |
| 82 def t_xxx(self, s): # not sure what this production means | |
| 83 r"<=" | |
| 84 self.rv.append(Token(s, self.lineno)) | |
| 85 | |
| 86 def t_punctuation(self, s): | |
| 87 r"[\{\}\*\=\|\(\)\,\?\:]" | |
| 88 self.rv.append(Token(s, self.lineno)) | |
| 89 | |
| 90 def t_comment(self, s): | |
| 91 r"\-\-[^\n]*" | |
| 92 pass | |
| 93 | |
| 94 def t_newline(self, s): | |
| 95 r"\n" | |
| 96 self.lineno += 1 | |
| 97 | |
| 98 def t_whitespace(self, s): | |
| 99 r"[ \t]+" | |
| 100 pass | |
| 101 | |
| 102 def t_default(self, s): | |
| 103 r" . +" | |
|
43071
c4a96de5e44e
More raise statement normalization.
Collin Winter <collinw@gmail.com>
parents:
41717
diff
changeset
|
104 raise ValueError("unmatched input: %r" % s) |
| 35742 | 105 |
| 106 class ASDLParser(spark.GenericParser, object): | |
| 107 def __init__(self): | |
| 108 super(ASDLParser, self).__init__("module") | |
| 109 | |
| 110 def typestring(self, tok): | |
| 111 return tok.type | |
| 112 | |
| 113 def error(self, tok): | |
| 114 raise ASDLSyntaxError(tok.lineno, tok) | |
| 115 | |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
116 def p_module_0(self, info): |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
117 " module ::= Id Id version { } " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
118 module, name, version, _0, _1 = info |
| 35742 | 119 if module.value != "module": |
| 120 raise ASDLSyntaxError(module.lineno, | |
| 121 msg="expected 'module', found %s" % module) | |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
122 return Module(name, None, version) |
| 35742 | 123 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
124 def p_module(self, info): |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
125 " module ::= Id Id version { definitions } " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
126 module, name, version, _0, definitions, _1 = info |
| 35742 | 127 if module.value != "module": |
| 128 raise ASDLSyntaxError(module.lineno, | |
| 129 msg="expected 'module', found %s" % module) | |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
130 return Module(name, definitions, version) |
|
36721
f7b4726ada6c
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
36703
diff
changeset
|
131 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
132 def p_version(self, info): |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
133 "version ::= Id String" |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
134 version, V = info |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
135 if version.value != "version": |
|
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
136 raise ASDLSyntaxError(version.lineno, |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
137 msg="expected 'version', found %" % version) |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
138 return V |
| 35742 | 139 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
140 def p_definition_0(self, definition): |
| 35742 | 141 " definitions ::= definition " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
142 return definition[0] |
| 35742 | 143 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
144 def p_definition_1(self, definitions): |
| 35742 | 145 " definitions ::= definition definitions " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
146 return definitions[0] + definitions[1] |
| 35742 | 147 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
148 def p_definition(self, info): |
| 35742 | 149 " definition ::= Id = type " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
150 id, _, type = info |
| 35742 | 151 return [Type(id, type)] |
| 152 | |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
153 def p_type_0(self, product): |
| 35742 | 154 " type ::= product " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
155 return product[0] |
| 35742 | 156 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
157 def p_type_1(self, sum): |
| 35742 | 158 " type ::= sum " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
159 return Sum(sum[0]) |
| 35742 | 160 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
161 def p_type_2(self, info): |
| 35742 | 162 " type ::= sum Id ( fields ) " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
163 sum, id, _0, attributes, _1 = info |
| 35742 | 164 if id.value != "attributes": |
| 165 raise ASDLSyntaxError(id.lineno, | |
| 166 msg="expected attributes, found %s" % id) | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36721
diff
changeset
|
167 if attributes: |
|
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36721
diff
changeset
|
168 attributes.reverse() |
| 35742 | 169 return Sum(sum, attributes) |
| 170 | |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
171 def p_product(self, info): |
| 35742 | 172 " product ::= ( fields ) " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
173 _0, fields, _1 = info |
| 35742 | 174 # XXX can't I just construct things in the right order? |
|
36121
686306a67e9b
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
35742
diff
changeset
|
175 fields.reverse() |
| 35742 | 176 return Product(fields) |
| 177 | |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
178 def p_sum_0(self, constructor): |
|
50569
8b2c1a0a9a2b
Merged revisions 68247 via svnmerge from
Georg Brandl <georg@python.org>
parents:
47354
diff
changeset
|
179 " sum ::= constructor " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
180 return [constructor[0]] |
| 35742 | 181 |
|
45796
0db7fa14c794
Add missing parameter spotted by Jared Flatow
Neal Norwitz <nnorwitz@gmail.com>
parents:
43071
diff
changeset
|
182 def p_sum_1(self, info): |
| 35742 | 183 " sum ::= constructor | sum " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
184 constructor, _, sum = info |
| 35742 | 185 return [constructor] + sum |
| 186 | |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
187 def p_sum_2(self, info): |
| 35742 | 188 " sum ::= constructor | sum " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
189 constructor, _, sum = info |
| 35742 | 190 return [constructor] + sum |
| 191 | |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
192 def p_constructor_0(self, id): |
| 35742 | 193 " constructor ::= Id " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
194 return Constructor(id[0]) |
| 35742 | 195 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
196 def p_constructor_1(self, info): |
| 35742 | 197 " constructor ::= Id ( fields ) " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
198 id, _0, fields, _1 = info |
| 35742 | 199 # XXX can't I just construct things in the right order? |
|
36121
686306a67e9b
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
35742
diff
changeset
|
200 fields.reverse() |
| 35742 | 201 return Constructor(id, fields) |
| 202 | |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
203 def p_fields_0(self, field): |
| 35742 | 204 " fields ::= field " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
205 return [field[0]] |
| 35742 | 206 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
207 def p_fields_1(self, info): |
| 35742 | 208 " fields ::= field , fields " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
209 field, _, fields = info |
| 35742 | 210 return fields + [field] |
| 211 | |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
212 def p_field_0(self, type_): |
| 35742 | 213 " field ::= Id " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
214 return Field(type_[0]) |
| 35742 | 215 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
216 def p_field_1(self, info): |
| 35742 | 217 " field ::= Id Id " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
218 type, name = info |
| 35742 | 219 return Field(type, name) |
| 220 | |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
221 def p_field_2(self, info): |
| 35742 | 222 " field ::= Id * Id " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
223 type, _, name = info |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
224 return Field(type, name, seq=True) |
| 35742 | 225 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
226 def p_field_3(self, info): |
| 35742 | 227 " field ::= Id ? Id " |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
228 type, _, name = info |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
229 return Field(type, name, opt=True) |
| 35742 | 230 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
231 def p_field_4(self, type_): |
| 35742 | 232 " field ::= Id * " |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
233 return Field(type_[0], seq=True) |
| 35742 | 234 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
235 def p_field_5(self, type_): |
| 35742 | 236 " field ::= Id ? " |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
237 return Field(type[0], opt=True) |
| 35742 | 238 |
| 239 builtin_types = ("identifier", "string", "int", "bool", "object") | |
| 240 | |
| 241 # below is a collection of classes to capture the AST of an AST :-) | |
| 242 # not sure if any of the methods are useful yet, but I'm adding them | |
| 243 # piecemeal as they seem helpful | |
| 244 | |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
245 class AST(object): |
| 35742 | 246 pass # a marker class |
| 247 | |
| 248 class Module(AST): | |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
249 def __init__(self, name, dfns, version): |
| 35742 | 250 self.name = name |
| 251 self.dfns = dfns | |
|
36703
9f3e58dbea63
Add support for version field on Modules
Martin v. Löwis <martin@v.loewis.de>
parents:
36121
diff
changeset
|
252 self.version = version |
| 35742 | 253 self.types = {} # maps type name to value (from dfns) |
| 254 for type in dfns: | |
| 255 self.types[type.name.value] = type.value | |
| 256 | |
| 257 def __repr__(self): | |
| 258 return "Module(%s, %s)" % (self.name, self.dfns) | |
| 259 | |
| 260 class Type(AST): | |
| 261 def __init__(self, name, value): | |
| 262 self.name = name | |
| 263 self.value = value | |
| 264 | |
| 265 def __repr__(self): | |
| 266 return "Type(%s, %s)" % (self.name, self.value) | |
| 267 | |
| 268 class Constructor(AST): | |
| 269 def __init__(self, name, fields=None): | |
| 270 self.name = name | |
| 271 self.fields = fields or [] | |
| 272 | |
| 273 def __repr__(self): | |
| 274 return "Constructor(%s, %s)" % (self.name, self.fields) | |
| 275 | |
| 276 class Field(AST): | |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
277 def __init__(self, type, name=None, seq=False, opt=False): |
| 35742 | 278 self.type = type |
| 279 self.name = name | |
| 280 self.seq = seq | |
| 281 self.opt = opt | |
| 282 | |
| 283 def __repr__(self): | |
| 284 if self.seq: | |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
285 extra = ", seq=True" |
| 35742 | 286 elif self.opt: |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
287 extra = ", opt=True" |
| 35742 | 288 else: |
| 289 extra = "" | |
| 290 if self.name is None: | |
| 291 return "Field(%s%s)" % (self.type, extra) | |
| 292 else: | |
| 293 return "Field(%s, %s%s)" % (self.type, self.name, extra) | |
| 294 | |
| 295 class Sum(AST): | |
| 296 def __init__(self, types, attributes=None): | |
| 297 self.types = types | |
| 298 self.attributes = attributes or [] | |
| 299 | |
| 300 def __repr__(self): | |
| 301 if self.attributes is None: | |
| 302 return "Sum(%s)" % self.types | |
| 303 else: | |
| 304 return "Sum(%s, %s)" % (self.types, self.attributes) | |
| 305 | |
| 306 class Product(AST): | |
| 307 def __init__(self, fields): | |
| 308 self.fields = fields | |
| 309 | |
| 310 def __repr__(self): | |
| 311 return "Product(%s)" % self.fields | |
| 312 | |
| 313 class VisitorBase(object): | |
| 314 | |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
315 def __init__(self, skip=False): |
| 35742 | 316 self.cache = {} |
| 317 self.skip = skip | |
| 318 | |
| 319 def visit(self, object, *args): | |
| 320 meth = self._dispatch(object) | |
| 321 if meth is None: | |
| 322 return | |
| 323 try: | |
| 324 meth(object, *args) | |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
325 except Exception: |
|
55606
ff6eea017a7f
Merged revisions 74010,74034,74054 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54703
diff
changeset
|
326 output("Error visiting" + repr(object)) |
|
ff6eea017a7f
Merged revisions 74010,74034,74054 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54703
diff
changeset
|
327 output(str(sys.exc_info()[1])) |
| 35742 | 328 traceback.print_exc() |
| 329 # XXX hack | |
| 330 if hasattr(self, 'file'): | |
| 331 self.file.flush() | |
| 332 os._exit(1) | |
| 333 | |
| 334 def _dispatch(self, object): | |
| 335 assert isinstance(object, AST), repr(object) | |
| 336 klass = object.__class__ | |
| 337 meth = self.cache.get(klass) | |
| 338 if meth is None: | |
| 339 methname = "visit" + klass.__name__ | |
| 340 if self.skip: | |
| 341 meth = getattr(self, methname, None) | |
| 342 else: | |
| 343 meth = getattr(self, methname) | |
| 344 self.cache[klass] = meth | |
| 345 return meth | |
| 346 | |
| 347 class Check(VisitorBase): | |
| 348 | |
| 349 def __init__(self): | |
|
54703
6370d71e3ca3
Merged revisions 73196,73278-73280,73299,73308,73312-73313,73317-73318,73321,73324,73331,73335,73340,73363 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53081
diff
changeset
|
350 super(Check, self).__init__(skip=True) |
| 35742 | 351 self.cons = {} |
| 352 self.errors = 0 | |
| 353 self.types = {} | |
| 354 | |
| 355 def visitModule(self, mod): | |
| 356 for dfn in mod.dfns: | |
| 357 self.visit(dfn) | |
| 358 | |
| 359 def visitType(self, type): | |
| 360 self.visit(type.value, str(type.name)) | |
| 361 | |
| 362 def visitSum(self, sum, name): | |
| 363 for t in sum.types: | |
| 364 self.visit(t, name) | |
| 365 | |
| 366 def visitConstructor(self, cons, name): | |
| 367 key = str(cons.name) | |
| 368 conflict = self.cons.get(key) | |
| 369 if conflict is None: | |
| 370 self.cons[key] = name | |
| 371 else: | |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
372 output("Redefinition of constructor %s" % key) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
373 output("Defined in %s and %s" % (conflict, name)) |
| 35742 | 374 self.errors += 1 |
| 375 for f in cons.fields: | |
| 376 self.visit(f, key) | |
| 377 | |
| 378 def visitField(self, field, name): | |
| 379 key = str(field.type) | |
| 380 l = self.types.setdefault(key, []) | |
| 381 l.append(name) | |
| 382 | |
| 383 def visitProduct(self, prod, name): | |
| 384 for f in prod.fields: | |
| 385 self.visit(f, name) | |
| 386 | |
| 387 def check(mod): | |
| 388 v = Check() | |
| 389 v.visit(mod) | |
| 390 | |
| 391 for t in v.types: | |
|
40533
b19ed543d695
avoid dict.has_key, since this might get used by a Py3K built in the
Fred Drake <fdrake@acm.org>
parents:
39672
diff
changeset
|
392 if t not in mod.types and not t in builtin_types: |
| 35742 | 393 v.errors += 1 |
| 394 uses = ", ".join(v.types[t]) | |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
395 output("Undefined type %s, used in %s" % (t, uses)) |
|
36121
686306a67e9b
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
35742
diff
changeset
|
396 |
| 35742 | 397 return not v.errors |
| 398 | |
| 399 def parse(file): | |
| 400 scanner = ASDLScanner() | |
| 401 parser = ASDLParser() | |
| 402 | |
| 403 buf = open(file).read() | |
| 404 tokens = scanner.tokenize(buf) | |
| 405 try: | |
| 406 return parser.parse(tokens) | |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
407 except ASDLSyntaxError: |
|
53081
d23e84e418ce
#2725: Fix missing local, and handle errors without tracebacks.
Georg Brandl <georg@python.org>
parents:
50569
diff
changeset
|
408 err = sys.exc_info()[1] |
|
d23e84e418ce
#2725: Fix missing local, and handle errors without tracebacks.
Georg Brandl <georg@python.org>
parents:
50569
diff
changeset
|
409 output(str(err)) |
| 35742 | 410 lines = buf.split("\n") |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
411 output(lines[err.lineno - 1]) # lines starts at 0, files at 1 |
| 35742 | 412 |
| 413 if __name__ == "__main__": | |
| 414 import glob | |
| 415 import sys | |
| 416 | |
| 417 if len(sys.argv) > 1: | |
| 418 files = sys.argv[1:] | |
| 419 else: | |
| 420 testdir = "tests" | |
| 421 files = glob.glob(testdir + "/*.asdl") | |
|
36121
686306a67e9b
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
35742
diff
changeset
|
422 |
| 35742 | 423 for file in files: |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
424 output(file) |
| 35742 | 425 mod = parse(file) |
|
53081
d23e84e418ce
#2725: Fix missing local, and handle errors without tracebacks.
Georg Brandl <georg@python.org>
parents:
50569
diff
changeset
|
426 if not mod: |
|
d23e84e418ce
#2725: Fix missing local, and handle errors without tracebacks.
Georg Brandl <georg@python.org>
parents:
50569
diff
changeset
|
427 break |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
428 output("module", mod.name) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
429 output(len(mod.dfns), "definitions") |
| 35742 | 430 if not check(mod): |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
431 output("Check failed") |
| 35742 | 432 else: |
| 433 for dfn in mod.dfns: | |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40533
diff
changeset
|
434 output(dfn.type) |
