14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Parse tree transformation module. 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTransforms Python source code into an abstract syntax tree (AST) 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdefined in the ast module. 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe simplest ways to invoke this module are via parse and parseFile. 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmparse(buf) -> AST 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmparseFile(path) -> AST 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm""" 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Original version written by Greg Stein (gstein@lyra.org) 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# and Bill Tutt (rassilon@lima.mudlib.org) 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# February 1997. 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Modifications and improvements for Python 2.0 by Jeremy Hylton and 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Mark Hammond 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Some fixes to try to have correct line number on almost all nodes 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# (except Module, Discard and Stmt) added by Sylvain Thenault 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Portions of this file are: 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Copyright (C) 1997-1998 Greg Stein. All Rights Reserved. 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# This module is provided under a BSD-ish license. See 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# http://www.opensource.org/licenses/bsd-license.html 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# and replace OWNER, ORGANIZATION, and YEAR as appropriate. 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom compiler.ast import * 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport parser 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport symbol 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport token 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass WalkerError(StandardError): 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom compiler.consts import CO_VARARGS, CO_VARKEYWORDS 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom compiler.consts import OP_ASSIGN, OP_DELETE, OP_APPLY 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef parseFile(path): 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f = open(path, "U") 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # XXX The parser API tolerates files without a trailing newline, 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # but not strings without a trailing newline. Always add an extra 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # newline to the file contents, since we're going through the string 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # version of the API. 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm src = f.read() + "\n" 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f.close() 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return parse(src) 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef parse(buf, mode="exec"): 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if mode == "exec" or mode == "single": 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Transformer().parsesuite(buf) 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif mode == "eval": 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Transformer().parseexpr(buf) 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError("compile() arg 3 must be" 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm " 'exec' or 'eval' or 'single'") 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef asList(nodes): 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l = [] 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for item in nodes: 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if hasattr(item, "asList"): 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l.append(item.asList()) 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if type(item) is type( (None, None) ): 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l.append(tuple(asList(item))) 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif type(item) is type( [] ): 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l.append(asList(item)) 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l.append(item) 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return l 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef extractLineNo(ast): 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not isinstance(ast[1], tuple): 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # get a terminal node 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ast[2] 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for child in ast[1:]: 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(child, tuple): 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno = extractLineNo(child) 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if lineno is not None: 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return lineno 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef Node(*args): 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kind = args[0] 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if kind in nodes: 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return nodes[kind](*args[1:]) 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except TypeError: 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print nodes[kind], len(args), args 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError, "Can't find appropriate Node type: %s" % str(args) 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #return apply(ast.Node, args) 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Transformer: 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Utility object for transforming Python parse trees. 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Exposes the following methods: 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tree = transform(ast_tree) 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tree = parsesuite(text) 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tree = parseexpr(text) 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tree = parsefile(fileob | filename) 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._dispatch = {} 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for value, name in symbol.sym_name.items(): 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if hasattr(self, name): 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._dispatch[value] = getattr(self, name) 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._dispatch[token.NEWLINE] = self.com_NEWLINE 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._atom_dispatch = {token.LPAR: self.atom_lpar, 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.LSQB: self.atom_lsqb, 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.LBRACE: self.atom_lbrace, 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.BACKQUOTE: self.atom_backquote, 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.NUMBER: self.atom_number, 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.STRING: self.atom_string, 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.NAME: self.atom_name, 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.encoding = None 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def transform(self, tree): 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Transform an AST into a modified parse tree.""" 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not (isinstance(tree, tuple) or isinstance(tree, list)): 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tree = parser.st2tuple(tree, line_info=1) 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.compile_node(tree) 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def parsesuite(self, text): 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return a modified parse tree for the given suite text.""" 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.transform(parser.suite(text)) 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def parseexpr(self, text): 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return a modified parse tree for the given expression text.""" 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.transform(parser.expr(text)) 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def parsefile(self, file): 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return a modified parse tree for the contents of the given file.""" 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if type(file) == type(''): 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm file = open(file) 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.parsesuite(file.read()) 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # -------------------------------------------------------------- 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # PRIVATE METHODS 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def compile_node(self, node): 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ### emit a line-number node? 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = node[0] 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.encoding_decl: 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.encoding = node[2] 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[1] 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = node[0] 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.single_input: 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.single_input(node[1:]) 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.file_input: 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.file_input(node[1:]) 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.eval_input: 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.eval_input(node[1:]) 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.lambdef: 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.lambdef(node[1:]) 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.funcdef: 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.funcdef(node[1:]) 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.classdef: 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.classdef(node[1:]) 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError, ('unexpected node type', n) 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def single_input(self, node): 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ### do we want to do anything about being "interactive" ? 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # NEWLINE | simple_stmt | compound_stmt NEWLINE 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = node[0][0] 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n != token.NEWLINE: 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_stmt(node[0]) 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Pass() 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def file_input(self, nodelist): 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm doc = self.get_docstring(nodelist, symbol.file_input) 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if doc is not None: 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 1 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stmts = [] 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for node in nodelist[i:]: 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0] != token.ENDMARKER and node[0] != token.NEWLINE: 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.com_append_stmt(stmts, node) 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Module(doc, Stmt(stmts)) 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def eval_input(self, nodelist): 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # from the built-in function input() 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ### is this sufficient? 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Expression(self.com_node(nodelist[0])) 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def decorator_name(self, nodelist): 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm listlen = len(nodelist) 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert listlen >= 1 and listlen % 2 == 1 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm item = self.atom_name(nodelist) 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 1 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while i < listlen: 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[i][0] == token.DOT 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[i + 1][0] == token.NAME 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm item = Getattr(item, nodelist[i + 1][1]) 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i += 2 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return item 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def decorator(self, nodelist): 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # '@' dotted_name [ '(' [arglist] ')' ] 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert len(nodelist) in (3, 5, 6) 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[0][0] == token.AT 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[-1][0] == token.NEWLINE 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[1][0] == symbol.dotted_name 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm funcname = self.decorator_name(nodelist[1][1:]) 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) > 3: 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[2][0] == token.LPAR 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr = self.com_call_function(funcname, nodelist[3]) 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr = funcname 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return expr 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def decorators(self, nodelist): 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # decorators: decorator ([NEWLINE] decorator)* NEWLINE 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items = [] 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for dec_nodelist in nodelist: 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert dec_nodelist[0] == symbol.decorator 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append(self.decorator(dec_nodelist[1:])) 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Decorators(items) 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def decorated(self, nodelist): 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[0][0] == symbol.decorators 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[1][0] == symbol.funcdef: 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = [nodelist[0]] + list(nodelist[1][1:]) 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.funcdef(n) 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif nodelist[1][0] == symbol.classdef: 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm decorators = self.decorators(nodelist[0][1:]) 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cls = self.classdef(nodelist[1][1:]) 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cls.decorators = decorators 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return cls 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError() 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def funcdef(self, nodelist): 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # -6 -5 -4 -3 -2 -1 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # funcdef: [decorators] 'def' NAME parameters ':' suite 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # parameters: '(' [varargslist] ')' 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 6: 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[0][0] == symbol.decorators 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm decorators = self.decorators(nodelist[0][1:]) 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert len(nodelist) == 5 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm decorators = None 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno = nodelist[-4][2] 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm name = nodelist[-4][1] 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args = nodelist[-3][2] 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if args[0] == symbol.varargslist: 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names, defaults, flags = self.com_arglist(args[1:]) 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names = defaults = () 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags = 0 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm doc = self.get_docstring(nodelist[-1]) 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # code for function 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm code = self.com_node(nodelist[-1]) 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if doc is not None: 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert isinstance(code, Stmt) 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert isinstance(code.nodes[0], Discard) 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del code.nodes[0] 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Function(decorators, name, names, defaults, flags, doc, code, 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=lineno) 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def lambdef(self, nodelist): 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # lambdef: 'lambda' [varargslist] ':' test 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[2][0] == symbol.varargslist: 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names, defaults, flags = self.com_arglist(nodelist[2][1:]) 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names = defaults = () 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags = 0 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # code for lambda 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm code = self.com_node(nodelist[-1]) 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Lambda(names, defaults, flags, code, lineno=nodelist[1][2]) 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_lambdef = lambdef 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def classdef(self, nodelist): 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # classdef: 'class' NAME ['(' [testlist] ')'] ':' suite 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm name = nodelist[1][1] 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm doc = self.get_docstring(nodelist[-1]) 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[2][0] == token.COLON: 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bases = [] 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif nodelist[3][0] == token.RPAR: 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bases = [] 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bases = self.com_bases(nodelist[3]) 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # code for class 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm code = self.com_node(nodelist[-1]) 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if doc is not None: 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert isinstance(code, Stmt) 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert isinstance(code.nodes[0], Discard) 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del code.nodes[0] 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Class(name, bases, doc, code, lineno=nodelist[1][2]) 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def stmt(self, nodelist): 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_stmt(nodelist[0]) 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm small_stmt = stmt 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flow_stmt = stmt 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm compound_stmt = stmt 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def simple_stmt(self, nodelist): 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # small_stmt (';' small_stmt)* [';'] NEWLINE 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stmts = [] 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(0, len(nodelist), 2): 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.com_append_stmt(stmts, nodelist[i]) 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Stmt(stmts) 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def parameters(self, nodelist): 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def varargslist(self, nodelist): 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def fpdef(self, nodelist): 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def fplist(self, nodelist): 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def dotted_name(self, nodelist): 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def comp_op(self, nodelist): 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def trailer(self, nodelist): 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def sliceop(self, nodelist): 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def argument(self, nodelist): 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # -------------------------------------------------------------- 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # STATEMENT NODES (invoked by com_node()) 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def expr_stmt(self, nodelist): 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # augassign testlist | testlist ('=' testlist)* 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm en = nodelist[-1] 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exprNode = self.lookup_node(en)(en[1:]) 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 1: 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Discard(exprNode, lineno=exprNode.lineno) 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[1][0] == token.EQUAL: 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nodesl = [] 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(0, len(nodelist) - 2, 2): 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nodesl.append(self.com_assign(nodelist[i], OP_ASSIGN)) 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Assign(nodesl, exprNode, lineno=nodelist[1][2]) 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lval = self.com_augassign(nodelist[0]) 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op = self.com_augassign_op(nodelist[1]) 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return AugAssign(lval, op[1], exprNode, lineno=op[2]) 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise WalkerError, "can't get here" 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def print_stmt(self, nodelist): 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # print ([ test (',' test)* [','] ] | '>>' test [ (',' test)+ [','] ]) 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items = [] 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 1: 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = 1 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dest = None 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif nodelist[1][0] == token.RIGHTSHIFT: 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert len(nodelist) == 3 \ 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm or nodelist[3][0] == token.COMMA 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dest = self.com_node(nodelist[2]) 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = 4 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dest = None 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = 1 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(start, len(nodelist), 2): 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append(self.com_node(nodelist[i])) 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[-1][0] == token.COMMA: 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Print(items, dest, lineno=nodelist[0][2]) 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Printnl(items, dest, lineno=nodelist[0][2]) 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def del_stmt(self, nodelist): 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_assign(nodelist[1], OP_DELETE) 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def pass_stmt(self, nodelist): 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Pass(lineno=nodelist[0][2]) 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def break_stmt(self, nodelist): 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Break(lineno=nodelist[0][2]) 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def continue_stmt(self, nodelist): 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Continue(lineno=nodelist[0][2]) 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def return_stmt(self, nodelist): 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # return: [testlist] 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) < 2: 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Return(Const(None), lineno=nodelist[0][2]) 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Return(self.com_node(nodelist[1]), lineno=nodelist[0][2]) 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def yield_stmt(self, nodelist): 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr = self.com_node(nodelist[0]) 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Discard(expr, lineno=expr.lineno) 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def yield_expr(self, nodelist): 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) > 1: 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = self.com_node(nodelist[1]) 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = Const(None) 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Yield(value, lineno=nodelist[0][2]) 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def raise_stmt(self, nodelist): 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # raise: [test [',' test [',' test]]] 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) > 5: 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr3 = self.com_node(nodelist[5]) 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr3 = None 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) > 3: 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr2 = self.com_node(nodelist[3]) 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr2 = None 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) > 1: 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr1 = self.com_node(nodelist[1]) 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr1 = None 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Raise(expr1, expr2, expr3, lineno=nodelist[0][2]) 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def import_stmt(self, nodelist): 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # import_stmt: import_name | import_from 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert len(nodelist) == 1 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_node(nodelist[0]) 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def import_name(self, nodelist): 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # import_name: 'import' dotted_as_names 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Import(self.com_dotted_as_names(nodelist[1]), 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=nodelist[0][2]) 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def import_from(self, nodelist): 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # import_from: 'from' ('.'* dotted_name | '.') 'import' ('*' | 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # '(' import_as_names ')' | import_as_names) 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[0][1] == 'from' 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm idx = 1 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while nodelist[idx][1] == '.': 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm idx += 1 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm level = idx - 1 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[idx][0] == symbol.dotted_name: 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fromname = self.com_dotted_name(nodelist[idx]) 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm idx += 1 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fromname = "" 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[idx][1] == 'import' 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[idx + 1][0] == token.STAR: 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return From(fromname, [('*', None)], level, 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=nodelist[0][2]) 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = nodelist[idx + 1 + (nodelist[idx + 1][0] == token.LPAR)] 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return From(fromname, self.com_import_as_names(node), level, 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=nodelist[0][2]) 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def global_stmt(self, nodelist): 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # global: NAME (',' NAME)* 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names = [] 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(1, len(nodelist), 2): 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names.append(nodelist[i][1]) 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Global(names, lineno=nodelist[0][2]) 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def exec_stmt(self, nodelist): 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # exec_stmt: 'exec' expr ['in' expr [',' expr]] 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr1 = self.com_node(nodelist[1]) 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) >= 4: 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr2 = self.com_node(nodelist[3]) 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) >= 6: 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr3 = self.com_node(nodelist[5]) 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr3 = None 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr2 = expr3 = None 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Exec(expr1, expr2, expr3, lineno=nodelist[0][2]) 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def assert_stmt(self, nodelist): 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 'assert': test, [',' test] 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr1 = self.com_node(nodelist[1]) 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len(nodelist) == 4): 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr2 = self.com_node(nodelist[3]) 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr2 = None 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Assert(expr1, expr2, lineno=nodelist[0][2]) 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def if_stmt(self, nodelist): 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # if: test ':' suite ('elif' test ':' suite)* ['else' ':' suite] 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tests = [] 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(0, len(nodelist) - 3, 4): 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm testNode = self.com_node(nodelist[i + 1]) 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm suiteNode = self.com_node(nodelist[i + 3]) 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tests.append((testNode, suiteNode)) 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) % 4 == 3: 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elseNode = self.com_node(nodelist[-1]) 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm## elseNode.lineno = nodelist[-1][1][2] 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elseNode = None 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return If(tests, elseNode, lineno=nodelist[0][2]) 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def while_stmt(self, nodelist): 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 'while' test ':' suite ['else' ':' suite] 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm testNode = self.com_node(nodelist[1]) 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bodyNode = self.com_node(nodelist[3]) 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) > 4: 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elseNode = self.com_node(nodelist[6]) 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elseNode = None 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return While(testNode, bodyNode, elseNode, lineno=nodelist[0][2]) 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def for_stmt(self, nodelist): 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assignNode = self.com_assign(nodelist[1], OP_ASSIGN) 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm listNode = self.com_node(nodelist[3]) 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bodyNode = self.com_node(nodelist[5]) 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) > 8: 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elseNode = self.com_node(nodelist[8]) 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elseNode = None 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return For(assignNode, listNode, bodyNode, elseNode, 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=nodelist[0][2]) 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def try_stmt(self, nodelist): 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_try_except_finally(nodelist) 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def with_stmt(self, nodelist): 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_with(nodelist) 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def with_var(self, nodelist): 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_with_var(nodelist) 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def suite(self, nodelist): 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 1: 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_stmt(nodelist[0]) 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stmts = [] 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for node in nodelist: 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0] == symbol.stmt: 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.com_append_stmt(stmts, node) 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Stmt(stmts) 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # -------------------------------------------------------------- 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # EXPRESSION NODES (invoked by com_node()) 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def testlist(self, nodelist): 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # testlist: expr (',' expr)* [','] 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # testlist_safe: test [(',' test)+ [',']] 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # exprlist: expr (',' expr)* [','] 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_binary(Tuple, nodelist) 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm testlist_safe = testlist # XXX 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm testlist1 = testlist 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exprlist = testlist 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def testlist_comp(self, nodelist): 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test ( comp_for | (',' test)* [','] ) 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[0][0] == symbol.test 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 2 and nodelist[1][0] == symbol.comp_for: 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test = self.com_node(nodelist[0]) 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_generator_expression(test, nodelist[1]) 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.testlist(nodelist) 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test(self, nodelist): 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # or_test ['if' or_test 'else' test] | lambdef 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 1 and nodelist[0][0] == symbol.lambdef: 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.lambdef(nodelist[0]) 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm then = self.com_node(nodelist[0]) 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) > 1: 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert len(nodelist) == 5 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[1][1] == 'if' 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[3][1] == 'else' 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test = self.com_node(nodelist[2]) 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else_ = self.com_node(nodelist[4]) 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return IfExp(test, then, else_, lineno=nodelist[1][2]) 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return then 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def or_test(self, nodelist): 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # and_test ('or' and_test)* | lambdef 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 1 and nodelist[0][0] == symbol.lambdef: 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.lambdef(nodelist[0]) 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_binary(Or, nodelist) 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_test = or_test 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def and_test(self, nodelist): 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # not_test ('and' not_test)* 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_binary(And, nodelist) 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def not_test(self, nodelist): 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 'not' not_test | comparison 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = self.com_node(nodelist[-1]) 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 2: 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Not(result, lineno=nodelist[0][2]) 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def comparison(self, nodelist): 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # comparison: expr (comp_op expr)* 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_node(nodelist[0]) 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 1: 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm results = [] 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(2, len(nodelist), 2): 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nl = nodelist[i-1] 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '==' 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # | 'in' | 'not' 'in' | 'is' | 'is' 'not' 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = nl[1] 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n[0] == token.NAME: 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type = n[1] 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nl) == 3: 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if type == 'not': 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type = 'not in' 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type = 'is not' 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type = _cmp_types[n[0]] 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno = nl[1][2] 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm results.append((type, self.com_node(nodelist[i]))) 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # we need a special "compare" node so that we can distinguish 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 3 < x < 5 from (3 < x) < 5 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # the two have very different semantics and results (note that the 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # latter form is always true) 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Compare(node, results, lineno=lineno) 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def expr(self, nodelist): 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # xor_expr ('|' xor_expr)* 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_binary(Bitor, nodelist) 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def xor_expr(self, nodelist): 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # xor_expr ('^' xor_expr)* 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_binary(Bitxor, nodelist) 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def and_expr(self, nodelist): 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # xor_expr ('&' xor_expr)* 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_binary(Bitand, nodelist) 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def shift_expr(self, nodelist): 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # shift_expr ('<<'|'>>' shift_expr)* 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_node(nodelist[0]) 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(2, len(nodelist), 2): 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm right = self.com_node(nodelist[i]) 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[i-1][0] == token.LEFTSHIFT: 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = LeftShift([node, right], lineno=nodelist[1][2]) 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif nodelist[i-1][0] == token.RIGHTSHIFT: 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = RightShift([node, right], lineno=nodelist[1][2]) 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError, "unexpected token: %s" % nodelist[i-1][0] 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def arith_expr(self, nodelist): 6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_node(nodelist[0]) 6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(2, len(nodelist), 2): 6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm right = self.com_node(nodelist[i]) 6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[i-1][0] == token.PLUS: 6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = Add([node, right], lineno=nodelist[1][2]) 6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif nodelist[i-1][0] == token.MINUS: 6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = Sub([node, right], lineno=nodelist[1][2]) 6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError, "unexpected token: %s" % nodelist[i-1][0] 6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node 6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def term(self, nodelist): 6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_node(nodelist[0]) 6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(2, len(nodelist), 2): 6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm right = self.com_node(nodelist[i]) 6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = nodelist[i-1][0] 6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.STAR: 7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = Mul([node, right]) 7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == token.SLASH: 7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = Div([node, right]) 7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == token.PERCENT: 7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = Mod([node, right]) 7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == token.DOUBLESLASH: 7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = FloorDiv([node, right]) 7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError, "unexpected token: %s" % t 7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.lineno = nodelist[1][2] 7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node 7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def factor(self, nodelist): 7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elt = nodelist[0] 7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = elt[0] 7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.lookup_node(nodelist[-1])(nodelist[-1][1:]) 7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # need to handle (unary op)constant here... 7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.PLUS: 7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return UnaryAdd(node, lineno=elt[2]) 7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == token.MINUS: 7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return UnarySub(node, lineno=elt[2]) 7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == token.TILDE: 7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = Invert(node, lineno=elt[2]) 7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node 7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def power(self, nodelist): 7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # power: atom trailer* ('**' factor)* 7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_node(nodelist[0]) 7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(1, len(nodelist)): 7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elt = nodelist[i] 7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if elt[0] == token.DOUBLESTAR: 7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Power([node, self.com_node(nodelist[i+1])], 7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=elt[2]) 7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_apply_trailer(node, elt) 7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node 7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def atom(self, nodelist): 7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self._atom_dispatch[nodelist[0][0]](nodelist) 7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def atom_lpar(self, nodelist): 7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[1][0] == token.RPAR: 7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Tuple((), lineno=nodelist[0][2]) 7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_node(nodelist[1]) 7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def atom_lsqb(self, nodelist): 7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[1][0] == token.RSQB: 7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return List((), lineno=nodelist[0][2]) 7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_list_constructor(nodelist[1]) 7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def atom_lbrace(self, nodelist): 7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[1][0] == token.RBRACE: 7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Dict((), lineno=nodelist[0][2]) 7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_dictorsetmaker(nodelist[1]) 7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def atom_backquote(self, nodelist): 7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Backquote(self.com_node(nodelist[1])) 7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def atom_number(self, nodelist): 7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ### need to verify this matches compile.c 7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k = eval(nodelist[0][1]) 7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Const(k, lineno=nodelist[0][2]) 7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def decode_literal(self, lit): 7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.encoding: 7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # this is particularly fragile & a bit of a 7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # hack... changes in compile.c:parsestr and 7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # tokenizer.c must be reflected here. 7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.encoding not in ['utf-8', 'iso-8859-1']: 7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lit = unicode(lit, 'utf-8').encode(self.encoding) 7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return eval("# coding: %s\n%s" % (self.encoding, lit)) 7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return eval(lit) 7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def atom_string(self, nodelist): 7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k = '' 7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for node in nodelist: 7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k += self.decode_literal(node[1]) 7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Const(k, lineno=nodelist[0][2]) 7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def atom_name(self, nodelist): 7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Name(nodelist[0][1], lineno=nodelist[0][2]) 7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # -------------------------------------------------------------- 7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # INTERNAL PARSING UTILITIES 7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # The use of com_node() introduces a lot of extra stack frames, 7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # enough to cause a stack overflow compiling test.test_parser with 7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # the standard interpreter recursionlimit. The com_node() is a 7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # convenience function that hides the dispatch details, but comes 7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # at a very high cost. It is more efficient to dispatch directly 7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # in the callers. In these cases, use lookup_node() and call the 7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # dispatched node directly. 7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def lookup_node(self, node): 7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self._dispatch[node[0]] 7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_node(self, node): 8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Note: compile.c has handling in com_node for del_stmt, pass_stmt, 8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # break_stmt, stmt, small_stmt, flow_stmt, simple_stmt, 8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # and compound_stmt. 8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # We'll just dispatch them. 8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self._dispatch[node[0]](node[1:]) 8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_NEWLINE(self, *args): 8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # A ';' at the end of a line can make a NEWLINE token appear 8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # here, Render it harmless. (genc discards ('discard', 8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # ('const', xxxx)) Nodes) 8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Discard(Const(None)) 8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_arglist(self, nodelist): 8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # varargslist: 8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME) 8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # | fpdef ['=' test] (',' fpdef ['=' test])* [','] 8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # fpdef: NAME | '(' fplist ')' 8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # fplist: fpdef (',' fpdef)* [','] 8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names = [] 8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm defaults = [] 8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags = 0 8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0 8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while i < len(nodelist): 8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = nodelist[i] 8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0] == token.STAR or node[0] == token.DOUBLESTAR: 8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0] == token.STAR: 8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = nodelist[i+1] 8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0] == token.NAME: 8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names.append(node[1]) 8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags = flags | CO_VARARGS 8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = i + 3 8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if i < len(nodelist): 8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # should be DOUBLESTAR 8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = nodelist[i][0] 8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.DOUBLESTAR: 8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = nodelist[i+1] 8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError, "unexpected token: %s" % t 8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names.append(node[1]) 8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags = flags | CO_VARKEYWORDS 8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # fpdef: NAME | '(' fplist ')' 8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names.append(self.com_fpdef(node)) 8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = i + 1 8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if i < len(nodelist) and nodelist[i][0] == token.EQUAL: 8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm defaults.append(self.com_node(nodelist[i + 1])) 8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = i + 2 8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif len(defaults): 8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # we have already seen an argument with default, but here 8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # came one without 8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "non-default argument follows default argument" 8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # skip the comma 8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = i + 1 8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return names, defaults, flags 8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_fpdef(self, node): 8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # fpdef: NAME | '(' fplist ')' 8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[1][0] == token.LPAR: 8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_fplist(node[2]) 8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node[1][1] 8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_fplist(self, node): 8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # fplist: fpdef (',' fpdef)* [','] 8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) == 2: 8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_fpdef(node[1]) 8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list = [] 8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(1, len(node), 2): 8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list.append(self.com_fpdef(node[i])) 8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return tuple(list) 8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_dotted_name(self, node): 8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # String together the dotted names and return the string 8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm name = "" 8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for n in node: 8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if type(n) == type(()) and n[0] == 1: 8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm name = name + n[1] + '.' 8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return name[:-1] 8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_dotted_as_name(self, node): 8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[0] == symbol.dotted_as_name 8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[1:] 8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dot = self.com_dotted_name(node[0][1:]) 8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) == 1: 8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return dot, None 8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[1][1] == 'as' 8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[2][0] == token.NAME 8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return dot, node[2][1] 8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_dotted_as_names(self, node): 8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[0] == symbol.dotted_as_names 8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[1:] 8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names = [self.com_dotted_as_name(node[0])] 9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(2, len(node), 2): 9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names.append(self.com_dotted_as_name(node[i])) 9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return names 9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_import_as_name(self, node): 9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[0] == symbol.import_as_name 9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[1:] 9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[0][0] == token.NAME 9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) == 1: 9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node[0][1], None 9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[1][1] == 'as', node 9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[2][0] == token.NAME 9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node[0][1], node[2][1] 9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_import_as_names(self, node): 9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[0] == symbol.import_as_names 9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[1:] 9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names = [self.com_import_as_name(node[0])] 9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(2, len(node), 2): 9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm names.append(self.com_import_as_name(node[i])) 9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return names 9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_bases(self, node): 9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bases = [] 9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(1, len(node), 2): 9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bases.append(self.com_node(node[i])) 9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return bases 9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_try_except_finally(self, nodelist): 9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # ('try' ':' suite 9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # ((except_clause ':' suite)+ ['else' ':' suite] ['finally' ':' suite] 9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # | 'finally' ':' suite)) 9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[3][0] == token.NAME: 9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # first clause is a finally clause: only try-finally 9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return TryFinally(self.com_node(nodelist[2]), 9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.com_node(nodelist[5]), 9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=nodelist[0][2]) 9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #tryexcept: [TryNode, [except_clauses], elseNode)] 9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm clauses = [] 9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elseNode = None 9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finallyNode = None 9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(3, len(nodelist), 3): 9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = nodelist[i] 9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0] == symbol.except_clause: 9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # except_clause: 'except' [expr [(',' | 'as') expr]] */ 9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) > 2: 9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr1 = self.com_node(node[2]) 9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) > 4: 9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr2 = self.com_assign(node[4], OP_ASSIGN) 9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr2 = None 9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr1 = expr2 = None 9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm clauses.append((expr1, expr2, self.com_node(nodelist[i+2]))) 9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0] == token.NAME: 9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[1] == 'else': 9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elseNode = self.com_node(nodelist[i+2]) 9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif node[1] == 'finally': 9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finallyNode = self.com_node(nodelist[i+2]) 9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try_except = TryExcept(self.com_node(nodelist[2]), clauses, elseNode, 9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=nodelist[0][2]) 9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if finallyNode: 9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return TryFinally(try_except, finallyNode, lineno=nodelist[0][2]) 9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return try_except 9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_with(self, nodelist): 9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # with_stmt: 'with' with_item (',' with_item)* ':' suite 9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm body = self.com_node(nodelist[-1]) 9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(len(nodelist) - 3, 0, -2): 9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ret = self.com_with_item(nodelist[i], body, nodelist[0][2]) 9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if i == 1: 9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ret 9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm body = ret 9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_with_item(self, nodelist, body, lineno): 9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # with_item: test ['as' expr] 9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 4: 9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm var = self.com_assign(nodelist[3], OP_ASSIGN) 9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm var = None 9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr = self.com_node(nodelist[1]) 9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return With(expr, var, body, lineno=lineno) 9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_augassign_op(self, node): 9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[0] == symbol.augassign 9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node[1] 9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_augassign(self, node): 9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return node suitable for lvalue of augmented assignment 9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Names, slices, and attributes are the only allowable nodes. 9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l = self.com_node(node) 9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if l.__class__ in (Name, Slice, Subscript, Getattr): 9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return l 9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "can't assign to %s" % l.__class__.__name__ 10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_assign(self, node, assigning): 10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # return a node suitable for use as an "lvalue" 10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # loop to avoid trivial recursion 10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while 1: 10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = node[0] 10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t in (symbol.exprlist, symbol.testlist, symbol.testlist_safe, symbol.testlist_comp): 10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) > 2: 10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_assign_tuple(node, assigning) 10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[1] 10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t in _assign_types: 10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) > 2: 10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "can't assign to operator" 10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[1] 10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == symbol.power: 10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[1][0] != symbol.atom: 10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "can't assign to operator" 10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) > 2: 10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm primary = self.com_node(node[1]) 10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(2, len(node)-1): 10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ch = node[i] 10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ch[0] == token.DOUBLESTAR: 10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "can't assign to operator" 10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm primary = self.com_apply_trailer(primary, ch) 10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_assign_trailer(primary, node[-1], 10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assigning) 10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[1] 10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == symbol.atom: 10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = node[1][0] 10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.LPAR: 10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[2] 10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0] == token.RPAR: 10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "can't assign to ()" 10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == token.LSQB: 10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[2] 10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0] == token.RSQB: 10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "can't assign to []" 10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_assign_list(node, assigning) 10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == token.NAME: 10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_assign_name(node[1], assigning) 10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "can't assign to literal" 10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "bad assignment (%s)" % t 10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_assign_tuple(self, node, assigning): 10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assigns = [] 10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(1, len(node), 2): 10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assigns.append(self.com_assign(node[i], assigning)) 10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return AssTuple(assigns, lineno=extractLineNo(node)) 10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_assign_list(self, node, assigning): 10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assigns = [] 10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(1, len(node), 2): 10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if i + 1 < len(node): 10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[i + 1][0] == symbol.list_for: 10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "can't assign to list comprehension" 10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[i + 1][0] == token.COMMA, node[i + 1] 10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assigns.append(self.com_assign(node[i], assigning)) 10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return AssList(assigns, lineno=extractLineNo(node)) 10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_assign_name(self, node, assigning): 10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return AssName(node[1], assigning, lineno=node[2]) 10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_assign_trailer(self, primary, node, assigning): 10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = node[1][0] 10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.DOT: 10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_assign_attr(primary, node[2], assigning) 10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.LSQB: 10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_subscriptlist(primary, node[2], assigning) 10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.LPAR: 10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "can't assign to function call" 10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "unknown trailer type: %s" % t 10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_assign_attr(self, primary, node, assigning): 10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return AssAttr(primary, node[1], assigning, lineno=node[-1]) 10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_binary(self, constructor, nodelist): 10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Compile 'NODE (OP NODE)*' into (type, [ node1, ..., nodeN ])." 10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l = len(nodelist) 10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if l == 1: 10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = nodelist[0] 10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.lookup_node(n)(n[1:]) 10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items = [] 10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(0, l, 2): 10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = nodelist[i] 10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append(self.lookup_node(n)(n[1:])) 10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return constructor(items, lineno=extractLineNo(nodelist)) 10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_stmt(self, node): 10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = self.lookup_node(node)(node[1:]) 10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert result is not None 10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(result, Stmt): 10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result 10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Stmt([result]) 10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_append_stmt(self, stmts, node): 10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = self.lookup_node(node)(node[1:]) 10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert result is not None 10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(result, Stmt): 11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stmts.extend(result.nodes) 11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stmts.append(result) 11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_list_constructor(self, nodelist): 11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # listmaker: test ( list_for | (',' test)* [','] ) 11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm values = [] 11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(1, len(nodelist)): 11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[i][0] == symbol.list_for: 11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert len(nodelist[i:]) == 1 11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_list_comprehension(values[0], 11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nodelist[i]) 11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif nodelist[i][0] == token.COMMA: 11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue 11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm values.append(self.com_node(nodelist[i])) 11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return List(values, lineno=values[0].lineno) 11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_list_comprehension(self, expr, node): 11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_comprehension(expr, None, node, 'list') 11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_comprehension(self, expr1, expr2, node, type): 11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # list_iter: list_for | list_if 11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # list_for: 'for' exprlist 'in' testlist [list_iter] 11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # list_if: 'if' test [list_iter] 11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # XXX should raise SyntaxError for assignment 11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # XXX(avassalotti) Set and dict comprehensions should have generator 11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # semantics. In other words, they shouldn't leak 11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # variables outside of the comprehension's scope. 11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno = node[1][2] 11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fors = [] 11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while node: 11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = node[1][1] 11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == 'for': 11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assignNode = self.com_assign(node[2], OP_ASSIGN) 11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm compNode = self.com_node(node[4]) 11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newfor = ListCompFor(assignNode, compNode, []) 11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newfor.lineno = node[1][2] 11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fors.append(newfor) 11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) == 5: 11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = None 11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif type == 'list': 11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_list_iter(node[5]) 11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_comp_iter(node[5]) 11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == 'if': 11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test = self.com_node(node[2]) 11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newif = ListCompIf(test, lineno=node[1][2]) 11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newfor.ifs.append(newif) 11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) == 3: 11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = None 11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif type == 'list': 11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_list_iter(node[3]) 11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_comp_iter(node[3]) 11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, \ 11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ("unexpected comprehension element: %s %d" 11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm % (node, lineno)) 11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if type == 'list': 11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ListComp(expr1, fors, lineno=lineno) 11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif type == 'set': 11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return SetComp(expr1, fors, lineno=lineno) 11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif type == 'dict': 11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return DictComp(expr1, expr2, fors, lineno=lineno) 11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError("unexpected comprehension type: " + repr(type)) 11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_list_iter(self, node): 11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[0] == symbol.list_iter 11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node[1] 11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_comp_iter(self, node): 11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert node[0] == symbol.comp_iter 11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return node[1] 11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_generator_expression(self, expr, node): 11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # comp_iter: comp_for | comp_if 11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # comp_for: 'for' exprlist 'in' test [comp_iter] 11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # comp_if: 'if' test [comp_iter] 11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno = node[1][2] 11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fors = [] 11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while node: 11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = node[1][1] 11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == 'for': 11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assignNode = self.com_assign(node[2], OP_ASSIGN) 11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm genNode = self.com_node(node[4]) 11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newfor = GenExprFor(assignNode, genNode, [], 11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=node[1][2]) 11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fors.append(newfor) 11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len(node)) == 5: 11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = None 11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_comp_iter(node[5]) 11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif t == 'if': 11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test = self.com_node(node[2]) 11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newif = GenExprIf(test, lineno=node[1][2]) 11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newfor.ifs.append(newif) 12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) == 3: 12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = None 12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = self.com_comp_iter(node[3]) 12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, \ 12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ("unexpected generator expression element: %s %d" 12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm % (node, lineno)) 12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fors[0].is_outmost = True 12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return GenExpr(GenExprInner(expr, fors), lineno=lineno) 12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_dictorsetmaker(self, nodelist): 12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # dictorsetmaker: ( (test ':' test (comp_for | (',' test ':' test)* [','])) | 12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # (test (comp_for | (',' test)* [','])) ) 12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[0] == symbol.dictorsetmaker 12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nodelist = nodelist[1:] 12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 1 or nodelist[1][0] == token.COMMA: 12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # set literal 12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items = [] 12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(0, len(nodelist), 2): 12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append(self.com_node(nodelist[i])) 12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Set(items, lineno=items[0].lineno) 12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif nodelist[1][0] == symbol.comp_for: 12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # set comprehension 12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr = self.com_node(nodelist[0]) 12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_comprehension(expr, None, nodelist[1], 'set') 12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif len(nodelist) > 3 and nodelist[3][0] == symbol.comp_for: 12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # dict comprehension 12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert nodelist[1][0] == token.COLON 12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key = self.com_node(nodelist[0]) 12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = self.com_node(nodelist[2]) 12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_comprehension(key, value, nodelist[3], 'dict') 12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # dict literal 12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items = [] 12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(0, len(nodelist), 4): 12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append((self.com_node(nodelist[i]), 12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.com_node(nodelist[i+2]))) 12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Dict(items, lineno=items[0][0].lineno) 12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_apply_trailer(self, primaryNode, nodelist): 12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = nodelist[1][0] 12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.LPAR: 12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_call_function(primaryNode, nodelist[2]) 12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.DOT: 12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_select_member(primaryNode, nodelist[2]) 12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.LSQB: 12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_subscriptlist(primaryNode, nodelist[2], OP_APPLY) 12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, 'unknown node type: %s' % t 12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_select_member(self, primaryNode, nodelist): 12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[0] != token.NAME: 12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "member must be a name" 12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Getattr(primaryNode, nodelist[1], lineno=nodelist[2]) 12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_call_function(self, primaryNode, nodelist): 12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if nodelist[0] == token.RPAR: 12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return CallFunc(primaryNode, [], lineno=extractLineNo(nodelist)) 12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args = [] 12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kw = 0 12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm star_node = dstar_node = None 12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len_nodelist = len(nodelist) 12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 1 12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while i < len_nodelist: 12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = nodelist[i] 12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0]==token.STAR: 12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if star_node is not None: 12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, 'already have the varargs indentifier' 12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm star_node = self.com_node(nodelist[i+1]) 12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = i + 3 12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue 12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif node[0]==token.DOUBLESTAR: 12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if dstar_node is not None: 12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, 'already have the kwargs indentifier' 12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dstar_node = self.com_node(nodelist[i+1]) 12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = i + 3 12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue 12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # positional or named parameters 12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kw, result = self.com_argument(node, kw, star_node) 12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len_nodelist != 2 and isinstance(result, GenExpr) \ 12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and len(node) == 3 and node[2][0] == symbol.comp_for: 12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # allow f(x for x in y), but reject f(x for x in y, 1) 12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # should use f((x for x in y), 1) instead of f(x for x in y, 1) 12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, 'generator expression needs parenthesis' 12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args.append(result) 12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = i + 2 12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return CallFunc(primaryNode, args, star_node, dstar_node, 12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=extractLineNo(nodelist)) 12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_argument(self, nodelist, kw, star_node): 12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 3 and nodelist[2][0] == symbol.comp_for: 12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test = self.com_node(nodelist[1]) 12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0, self.com_generator_expression(test, nodelist[2]) 12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 2: 13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if kw: 13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "non-keyword arg after keyword arg" 13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if star_node: 13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "only named arguments may follow *expression" 13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0, self.com_node(nodelist[1]) 13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = self.com_node(nodelist[3]) 13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = nodelist[1] 13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while len(n) == 2 and n[0] != token.NAME: 13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = n[1] 13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n[0] != token.NAME: 13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise SyntaxError, "keyword can't be an expression (%s)"%n[0] 13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = Keyword(n[1], result, lineno=n[2]) 13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1, node 13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_subscriptlist(self, primary, nodelist, assigning): 13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # slicing: simple_slicing | extended_slicing 13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # simple_slicing: primary "[" short_slice "]" 13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # extended_slicing: primary "[" slice_list "]" 13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # slice_list: slice_item ("," slice_item)* [","] 13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # backwards compat slice for '[i:j]' 13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(nodelist) == 2: 13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub = nodelist[1] 13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sub[1][0] == token.COLON or \ 13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (len(sub) > 2 and sub[2][0] == token.COLON)) and \ 13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub[-1][0] != symbol.sliceop: 13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_slice(primary, sub, assigning) 13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm subscripts = [] 13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(1, len(nodelist), 2): 13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm subscripts.append(self.com_subscript(nodelist[i])) 13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Subscript(primary, assigning, subscripts, 13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=extractLineNo(nodelist)) 13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_subscript(self, node): 13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # slice_item: expression | proper_slice | ellipsis 13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ch = node[1] 13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = ch[0] 13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.DOT and node[2][0] == token.DOT: 13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Ellipsis() 13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if t == token.COLON or len(node) > 2: 13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_sliceobj(node) 13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.com_node(ch) 13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_sliceobj(self, node): 13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # proper_slice: short_slice | long_slice 13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # short_slice: [lower_bound] ":" [upper_bound] 13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # long_slice: short_slice ":" [stride] 13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # lower_bound: expression 13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # upper_bound: expression 13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # stride: expression 13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Note: a stride may be further slicing... 13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items = [] 13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[1][0] == token.COLON: 13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append(Const(None)) 13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 2 13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append(self.com_node(node[1])) 13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # i == 2 is a COLON 13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 3 13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if i < len(node) and node[i][0] == symbol.test: 13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append(self.com_node(node[i])) 13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = i + 1 13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append(Const(None)) 13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # a short_slice has been built. look for long_slice now by looking 13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # for strides... 13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for j in range(i, len(node)): 13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ch = node[j] 13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(ch) == 2: 13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append(Const(None)) 13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items.append(self.com_node(ch[2])) 13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Sliceobj(items, lineno=extractLineNo(node)) 13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def com_slice(self, primary, node, assigning): 13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # short_slice: [lower_bound] ":" [upper_bound] 13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lower = upper = None 13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) == 3: 13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[1][0] == token.COLON: 13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm upper = self.com_node(node[2]) 13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lower = self.com_node(node[1]) 13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif len(node) == 4: 13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lower = self.com_node(node[1]) 13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm upper = self.com_node(node[3]) 13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Slice(primary, assigning, lower, upper, 13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno=extractLineNo(node)) 13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def get_docstring(self, node, n=None): 13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n is None: 13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = node[0] 13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = node[1:] 13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.suite: 13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node) == 1: 14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.get_docstring(node[0]) 14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for sub in node: 14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sub[0] == symbol.stmt: 14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.get_docstring(sub) 14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return None 14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.file_input: 14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for sub in node: 14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sub[0] == symbol.stmt: 14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.get_docstring(sub) 14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return None 14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.atom: 14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node[0][0] == token.STRING: 14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = '' 14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for t in node: 14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = s + eval(t[1]) 14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return s 14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return None 14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n == symbol.stmt or n == symbol.simple_stmt \ 14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm or n == symbol.small_stmt: 14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.get_docstring(node[0]) 14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if n in _doc_nodes and len(node) == 1: 14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.get_docstring(node[0]) 14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return None 14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_doc_nodes = [ 14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.expr_stmt, 14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.testlist, 14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.testlist_safe, 14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.test, 14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.or_test, 14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.and_test, 14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.not_test, 14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.comparison, 14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.expr, 14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.xor_expr, 14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.and_expr, 14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.shift_expr, 14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.arith_expr, 14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.term, 14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.factor, 14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.power, 14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '==' 14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# | 'in' | 'not' 'in' | 'is' | 'is' 'not' 14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_cmp_types = { 14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.LESS : '<', 14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.GREATER : '>', 14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.EQEQUAL : '==', 14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.EQUAL : '==', 14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.LESSEQUAL : '<=', 14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.GREATEREQUAL : '>=', 14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm token.NOTEQUAL : '!=', 14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_legal_node_types = [ 14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.funcdef, 14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.classdef, 14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.stmt, 14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.small_stmt, 14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.flow_stmt, 14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.simple_stmt, 14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.compound_stmt, 14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.expr_stmt, 14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.print_stmt, 14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.del_stmt, 14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.pass_stmt, 14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.break_stmt, 14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.continue_stmt, 14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.return_stmt, 14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.raise_stmt, 14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.import_stmt, 14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.global_stmt, 14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.exec_stmt, 14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.assert_stmt, 14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.if_stmt, 14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.while_stmt, 14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.for_stmt, 14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.try_stmt, 14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.with_stmt, 14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.suite, 14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.testlist, 14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.testlist_safe, 14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.test, 14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.and_test, 14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.not_test, 14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.comparison, 14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.exprlist, 14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.expr, 14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.xor_expr, 14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.and_expr, 14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.shift_expr, 14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.arith_expr, 14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.term, 14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.factor, 14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.power, 14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.atom, 14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif hasattr(symbol, 'yield_stmt'): 15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _legal_node_types.append(symbol.yield_stmt) 15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif hasattr(symbol, 'yield_expr'): 15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _legal_node_types.append(symbol.yield_expr) 15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_assign_types = [ 15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.test, 15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.or_test, 15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.and_test, 15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.not_test, 15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.comparison, 15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.expr, 15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.xor_expr, 15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.and_expr, 15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.shift_expr, 15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.arith_expr, 15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.term, 15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm symbol.factor, 15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ] 15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_names = {} 15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor k, v in symbol.sym_name.items(): 15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _names[k] = v 15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor k, v in token.tok_name.items(): 15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _names[k] = v 15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef debug_tree(tree): 15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l = [] 15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for elt in tree: 15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(elt, int): 15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l.append(_names.get(elt, elt)) 15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif isinstance(elt, str): 15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l.append(elt) 15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm l.append(debug_tree(elt)) 15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return l 1536