Changeset 391 for python/trunk/Lib/compiler/transformer.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Lib/compiler/transformer.py
r2 r391 582 582 exprlist = testlist 583 583 584 def testlist_gexp(self, nodelist): 585 if len(nodelist) == 2 and nodelist[1][0] == symbol.gen_for: 584 def testlist_comp(self, nodelist): 585 # test ( comp_for | (',' test)* [','] ) 586 assert nodelist[0][0] == symbol.test 587 if len(nodelist) == 2 and nodelist[1][0] == symbol.comp_for: 586 588 test = self.com_node(nodelist[0]) 587 589 return self.com_generator_expression(test, nodelist[1]) … … 750 752 if nodelist[1][0] == token.RBRACE: 751 753 return Dict((), lineno=nodelist[0][2]) 752 return self.com_dict maker(nodelist[1])754 return self.com_dictorsetmaker(nodelist[1]) 753 755 754 756 def atom_backquote(self, nodelist): … … 966 968 967 969 def com_with(self, nodelist): 968 # with_stmt: 'with' expr [with_var] ':' suite 970 # with_stmt: 'with' with_item (',' with_item)* ':' suite 971 body = self.com_node(nodelist[-1]) 972 for i in range(len(nodelist) - 3, 0, -2): 973 ret = self.com_with_item(nodelist[i], body, nodelist[0][2]) 974 if i == 1: 975 return ret 976 body = ret 977 978 def com_with_item(self, nodelist, body, lineno): 979 # with_item: test ['as' expr] 980 if len(nodelist) == 4: 981 var = self.com_assign(nodelist[3], OP_ASSIGN) 982 else: 983 var = None 969 984 expr = self.com_node(nodelist[1]) 970 body = self.com_node(nodelist[-1]) 971 if nodelist[2][0] == token.COLON: 972 var = None 973 else: 974 var = self.com_assign(nodelist[2][2], OP_ASSIGN) 975 return With(expr, var, body, lineno=nodelist[0][2]) 976 977 def com_with_var(self, nodelist): 978 # with_var: 'as' expr 979 return self.com_node(nodelist[1]) 985 return With(expr, var, body, lineno=lineno) 980 986 981 987 def com_augassign_op(self, node): … … 998 1004 while 1: 999 1005 t = node[0] 1000 if t in (symbol.exprlist, symbol.testlist, symbol.testlist_safe, symbol.testlist_ gexp):1006 if t in (symbol.exprlist, symbol.testlist, symbol.testlist_safe, symbol.testlist_comp): 1001 1007 if len(node) > 2: 1002 1008 return self.com_assign_tuple(node, assigning) … … 1096 1102 stmts.append(result) 1097 1103 1098 if hasattr(symbol, 'list_for'): 1099 def com_list_constructor(self, nodelist): 1100 # listmaker: test ( list_for | (',' test)* [','] ) 1101 values = [] 1102 for i in range(1, len(nodelist)): 1103 if nodelist[i][0] == symbol.list_for: 1104 assert len(nodelist[i:]) == 1 1105 return self.com_list_comprehension(values[0], 1106 nodelist[i]) 1107 elif nodelist[i][0] == token.COMMA: 1108 continue 1109 values.append(self.com_node(nodelist[i])) 1110 return List(values, lineno=values[0].lineno) 1111 1112 def com_list_comprehension(self, expr, node): 1113 # list_iter: list_for | list_if 1114 # list_for: 'for' exprlist 'in' testlist [list_iter] 1115 # list_if: 'if' test [list_iter] 1116 1117 # XXX should raise SyntaxError for assignment 1118 1119 lineno = node[1][2] 1120 fors = [] 1121 while node: 1122 t = node[1][1] 1123 if t == 'for': 1124 assignNode = self.com_assign(node[2], OP_ASSIGN) 1125 listNode = self.com_node(node[4]) 1126 newfor = ListCompFor(assignNode, listNode, []) 1127 newfor.lineno = node[1][2] 1128 fors.append(newfor) 1129 if len(node) == 5: 1130 node = None 1131 else: 1132 node = self.com_list_iter(node[5]) 1133 elif t == 'if': 1134 test = self.com_node(node[2]) 1135 newif = ListCompIf(test, lineno=node[1][2]) 1136 newfor.ifs.append(newif) 1137 if len(node) == 3: 1138 node = None 1139 else: 1140 node = self.com_list_iter(node[3]) 1104 def com_list_constructor(self, nodelist): 1105 # listmaker: test ( list_for | (',' test)* [','] ) 1106 values = [] 1107 for i in range(1, len(nodelist)): 1108 if nodelist[i][0] == symbol.list_for: 1109 assert len(nodelist[i:]) == 1 1110 return self.com_list_comprehension(values[0], 1111 nodelist[i]) 1112 elif nodelist[i][0] == token.COMMA: 1113 continue 1114 values.append(self.com_node(nodelist[i])) 1115 return List(values, lineno=values[0].lineno) 1116 1117 def com_list_comprehension(self, expr, node): 1118 return self.com_comprehension(expr, None, node, 'list') 1119 1120 def com_comprehension(self, expr1, expr2, node, type): 1121 # list_iter: list_for | list_if 1122 # list_for: 'for' exprlist 'in' testlist [list_iter] 1123 # list_if: 'if' test [list_iter] 1124 1125 # XXX should raise SyntaxError for assignment 1126 # XXX(avassalotti) Set and dict comprehensions should have generator 1127 # semantics. In other words, they shouldn't leak 1128 # variables outside of the comprehension's scope. 1129 1130 lineno = node[1][2] 1131 fors = [] 1132 while node: 1133 t = node[1][1] 1134 if t == 'for': 1135 assignNode = self.com_assign(node[2], OP_ASSIGN) 1136 compNode = self.com_node(node[4]) 1137 newfor = ListCompFor(assignNode, compNode, []) 1138 newfor.lineno = node[1][2] 1139 fors.append(newfor) 1140 if len(node) == 5: 1141 node = None 1142 elif type == 'list': 1143 node = self.com_list_iter(node[5]) 1141 1144 else: 1142 raise SyntaxError, \ 1143 ("unexpected list comprehension element: %s %d" 1144 % (node, lineno)) 1145 return ListComp(expr, fors, lineno=lineno) 1146 1147 def com_list_iter(self, node): 1148 assert node[0] == symbol.list_iter 1149 return node[1] 1150 else: 1151 def com_list_constructor(self, nodelist): 1152 values = [] 1153 for i in range(1, len(nodelist), 2): 1154 values.append(self.com_node(nodelist[i])) 1155 return List(values, lineno=values[0].lineno) 1156 1157 if hasattr(symbol, 'gen_for'): 1158 def com_generator_expression(self, expr, node): 1159 # gen_iter: gen_for | gen_if 1160 # gen_for: 'for' exprlist 'in' test [gen_iter] 1161 # gen_if: 'if' test [gen_iter] 1162 1163 lineno = node[1][2] 1164 fors = [] 1165 while node: 1166 t = node[1][1] 1167 if t == 'for': 1168 assignNode = self.com_assign(node[2], OP_ASSIGN) 1169 genNode = self.com_node(node[4]) 1170 newfor = GenExprFor(assignNode, genNode, [], 1171 lineno=node[1][2]) 1172 fors.append(newfor) 1173 if (len(node)) == 5: 1174 node = None 1175 else: 1176 node = self.com_gen_iter(node[5]) 1177 elif t == 'if': 1178 test = self.com_node(node[2]) 1179 newif = GenExprIf(test, lineno=node[1][2]) 1180 newfor.ifs.append(newif) 1181 if len(node) == 3: 1182 node = None 1183 else: 1184 node = self.com_gen_iter(node[3]) 1145 node = self.com_comp_iter(node[5]) 1146 elif t == 'if': 1147 test = self.com_node(node[2]) 1148 newif = ListCompIf(test, lineno=node[1][2]) 1149 newfor.ifs.append(newif) 1150 if len(node) == 3: 1151 node = None 1152 elif type == 'list': 1153 node = self.com_list_iter(node[3]) 1185 1154 else: 1186 raise SyntaxError, \ 1187 ("unexpected generator expression element: %s %d" 1188 % (node, lineno)) 1189 fors[0].is_outmost = True 1190 return GenExpr(GenExprInner(expr, fors), lineno=lineno) 1191 1192 def com_gen_iter(self, node): 1193 assert node[0] == symbol.gen_iter 1194 return node[1] 1195 1196 def com_dictmaker(self, nodelist): 1197 # dictmaker: test ':' test (',' test ':' value)* [','] 1198 items = [] 1199 for i in range(1, len(nodelist), 4): 1200 items.append((self.com_node(nodelist[i]), 1201 self.com_node(nodelist[i+2]))) 1202 return Dict(items, lineno=items[0][0].lineno) 1155 node = self.com_comp_iter(node[3]) 1156 else: 1157 raise SyntaxError, \ 1158 ("unexpected comprehension element: %s %d" 1159 % (node, lineno)) 1160 if type == 'list': 1161 return ListComp(expr1, fors, lineno=lineno) 1162 elif type == 'set': 1163 return SetComp(expr1, fors, lineno=lineno) 1164 elif type == 'dict': 1165 return DictComp(expr1, expr2, fors, lineno=lineno) 1166 else: 1167 raise ValueError("unexpected comprehension type: " + repr(type)) 1168 1169 def com_list_iter(self, node): 1170 assert node[0] == symbol.list_iter 1171 return node[1] 1172 1173 def com_comp_iter(self, node): 1174 assert node[0] == symbol.comp_iter 1175 return node[1] 1176 1177 def com_generator_expression(self, expr, node): 1178 # comp_iter: comp_for | comp_if 1179 # comp_for: 'for' exprlist 'in' test [comp_iter] 1180 # comp_if: 'if' test [comp_iter] 1181 1182 lineno = node[1][2] 1183 fors = [] 1184 while node: 1185 t = node[1][1] 1186 if t == 'for': 1187 assignNode = self.com_assign(node[2], OP_ASSIGN) 1188 genNode = self.com_node(node[4]) 1189 newfor = GenExprFor(assignNode, genNode, [], 1190 lineno=node[1][2]) 1191 fors.append(newfor) 1192 if (len(node)) == 5: 1193 node = None 1194 else: 1195 node = self.com_comp_iter(node[5]) 1196 elif t == 'if': 1197 test = self.com_node(node[2]) 1198 newif = GenExprIf(test, lineno=node[1][2]) 1199 newfor.ifs.append(newif) 1200 if len(node) == 3: 1201 node = None 1202 else: 1203 node = self.com_comp_iter(node[3]) 1204 else: 1205 raise SyntaxError, \ 1206 ("unexpected generator expression element: %s %d" 1207 % (node, lineno)) 1208 fors[0].is_outmost = True 1209 return GenExpr(GenExprInner(expr, fors), lineno=lineno) 1210 1211 def com_dictorsetmaker(self, nodelist): 1212 # dictorsetmaker: ( (test ':' test (comp_for | (',' test ':' test)* [','])) | 1213 # (test (comp_for | (',' test)* [','])) ) 1214 assert nodelist[0] == symbol.dictorsetmaker 1215 nodelist = nodelist[1:] 1216 if len(nodelist) == 1 or nodelist[1][0] == token.COMMA: 1217 # set literal 1218 items = [] 1219 for i in range(0, len(nodelist), 2): 1220 items.append(self.com_node(nodelist[i])) 1221 return Set(items, lineno=items[0].lineno) 1222 elif nodelist[1][0] == symbol.comp_for: 1223 # set comprehension 1224 expr = self.com_node(nodelist[0]) 1225 return self.com_comprehension(expr, None, nodelist[1], 'set') 1226 elif len(nodelist) > 3 and nodelist[3][0] == symbol.comp_for: 1227 # dict comprehension 1228 assert nodelist[1][0] == token.COLON 1229 key = self.com_node(nodelist[0]) 1230 value = self.com_node(nodelist[2]) 1231 return self.com_comprehension(key, value, nodelist[3], 'dict') 1232 else: 1233 # dict literal 1234 items = [] 1235 for i in range(0, len(nodelist), 4): 1236 items.append((self.com_node(nodelist[i]), 1237 self.com_node(nodelist[i+2]))) 1238 return Dict(items, lineno=items[0][0].lineno) 1203 1239 1204 1240 def com_apply_trailer(self, primaryNode, nodelist): … … 1246 1282 1247 1283 if len_nodelist != 2 and isinstance(result, GenExpr) \ 1248 and len(node) == 3 and node[2][0] == symbol. gen_for:1284 and len(node) == 3 and node[2][0] == symbol.comp_for: 1249 1285 # allow f(x for x in y), but reject f(x for x in y, 1) 1250 1286 # should use f((x for x in y), 1) instead of f(x for x in y, 1) … … 1258 1294 1259 1295 def com_argument(self, nodelist, kw, star_node): 1260 if len(nodelist) == 3 and nodelist[2][0] == symbol. gen_for:1296 if len(nodelist) == 3 and nodelist[2][0] == symbol.comp_for: 1261 1297 test = self.com_node(nodelist[1]) 1262 1298 return 0, self.com_generator_expression(test, nodelist[2])
Note:
See TracChangeset
for help on using the changeset viewer.