# -*- coding: utf-8 -*- """ Part of the astor library for Python AST manipulation. License: 3-clause BSD Copyright (c) 2015 Patrick Maupin This module provides data and functions for mapping AST nodes to symbols and precedences. """ import ast op_data = """ GeneratorExp 1 Assign 1 AnnAssign 1 AugAssign 0 Expr 0 Yield 1 YieldFrom 0 If 1 For 0 AsyncFor 0 While 0 Return 1 Slice 1 Subscript 0 Index 1 ExtSlice 1 comprehension_target 1 Tuple 0 Comma 1 Assert 0 Raise 0 call_one_arg 1 Lambda 1 IfExp 0 comprehension 1 Or or 1 And and 1 Not not 1 Eq == 1 Gt > 0 GtE >= 0 In in 0 Is is 0 NotEq != 0 Lt < 0 LtE <= 0 NotIn not in 0 IsNot is not 0 BitOr | 1 BitXor ^ 1 BitAnd & 1 LShift << 1 RShift >> 0 Add + 1 Sub - 0 Mult * 1 Div / 0 Mod % 0 FloorDiv // 0 MatMult @ 0 PowRHS 1 Invert ~ 1 UAdd + 0 USub - 0 Pow ** 1 Await 1 Num 1 """ op_data = [x.split() for x in op_data.splitlines()] op_data = [[x[0], ' '.join(x[1:-1]), int(x[-1])] for x in op_data if x] for index in range(1, len(op_data)): op_data[index][2] *= 2 op_data[index][2] += op_data[index - 1][2] precedence_data = dict((getattr(ast, x, None), z) for x, y, z in op_data) symbol_data = dict((getattr(ast, x, None), y) for x, y, z in op_data) def get_op_symbol(obj, fmt='%s', symbol_data=symbol_data, type=type): """Given an AST node object, returns a string containing the symbol. """ return fmt % symbol_data[type(obj)] def get_op_precedence(obj, precedence_data=precedence_data, type=type): """Given an AST node object, returns the precedence. """ return precedence_data[type(obj)] class Precedence(object): vars().update((x, z) for x, y, z in op_data) highest = max(z for x, y, z in op_data) + 2