107 lines
3 KiB
Python
107 lines
3 KiB
Python
# -*- 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
|