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