| |
| """ |
| 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 |
| FormattedValue 0 |
| |
| Comma 1 |
| NamedExpr 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 |
| Constant 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 |
|
|