Files
TransPyC/includes/ast/exprs.py
2026-07-18 19:25:40 +08:00

1235 lines
40 KiB
Python

import t, c
from stdint import *
import memhub
import string
from .base import (
AST, ASTKind, ASTCtx, OpKind,
_init_ast, _copy_str, _set_parent_list,
_emit, _emit_str, _emit_int, _dump_list, _dump_op_list, _op_name,
CONST_INT, CONST_FLOAT, CONST_STR, CONST_BOOL, CONST_NONE
)
# ============================================================
# Name 节点
# ============================================================
class Name(AST):
"""Name(id: str, ctx: ASTCtx)"""
id: str
ctx: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
id: str, ctx: t.CInt):
ptr: Name | t.CPtr = pool.alloc(Name.__sizeof__())
if ptr:
string.memset(ptr, 0, Name.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
id: str, ctx: t.CInt):
_init_ast(self, pool, 0, 0)
self.id = _copy_str(pool, id)
self.ctx = ctx
def kind(self) -> t.CInt:
return ASTKind.Name
def type_name(self) -> str:
return "Name"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Name(id='")
pos = _emit_str(buf, size, pos, self.id)
pos = _emit(buf, size, pos, "', ctx=")
if self.ctx == ASTCtx.Load:
pos = _emit(buf, size, pos, "Load")
elif self.ctx == ASTCtx.Store:
pos = _emit(buf, size, pos, "Store")
else:
pos = _emit(buf, size, pos, "Del")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Constant 节点(用 const_kind 标识子类型)
# ============================================================
class Constant(AST):
"""Constant(int_val/float_val/str_val, const_kind)"""
int_val: t.CInt64T
float_val: t.CDouble
str_val: str
const_kind: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
const_kind: t.CInt, int_val: t.CInt64T,
float_val: t.CDouble, str_val: str,
lineno: t.CInt, col: t.CInt):
ptr: Constant | t.CPtr = pool.alloc(Constant.__sizeof__())
if ptr:
string.memset(ptr, 0, Constant.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
const_kind: t.CInt, int_val: t.CInt64T,
float_val: t.CDouble, str_val: str,
lineno: t.CInt, col: t.CInt):
_init_ast(self, pool, lineno, col)
self.const_kind = const_kind
self.int_val = int_val
self.float_val = float_val
if str_val is not None:
self.str_val = _copy_str(pool, str_val)
else:
self.str_val = None
def kind(self) -> t.CInt:
return ASTKind.Constant
def type_name(self) -> str:
return "Constant"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Constant(value=")
if self.const_kind == CONST_INT:
pos = _emit_int(buf, size, pos, self.int_val)
elif self.const_kind == CONST_FLOAT:
pos = _emit(buf, size, pos, "<float>")
elif self.const_kind == CONST_STR:
pos = _emit(buf, size, pos, "'")
if self.str_val is not None:
pos = _emit_str(buf, size, pos, self.str_val)
else:
pos = _emit(buf, size, pos, "(null)")
pos = _emit(buf, size, pos, "'")
elif self.const_kind == CONST_BOOL:
if self.int_val != 0:
pos = _emit(buf, size, pos, "True")
else:
pos = _emit(buf, size, pos, "False")
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# BinOp 节点
# ============================================================
class BinOp(AST):
"""BinOp(left: AST, op: OpKind, right: AST)"""
left: AST | t.CPtr
op: t.CInt
right: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
left: AST | t.CPtr, op: t.CInt, right: AST | t.CPtr):
ptr: BinOp | t.CPtr = pool.alloc(BinOp.__sizeof__())
if ptr:
string.memset(ptr, 0, BinOp.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
left: AST | t.CPtr, op: t.CInt, right: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.left = left
self.op = op
self.right = right
def kind(self) -> t.CInt:
return ASTKind.BinOp
def type_name(self) -> str:
return "BinOp"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "BinOp(left=")
if self.left is not None:
pos = self.left.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", op=")
pos = _emit(buf, size, pos, _op_name(self.op))
pos = _emit(buf, size, pos, ", right=")
if self.right is not None:
pos = self.right.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# UnaryOp 节点
# ============================================================
class UnaryOp(AST):
"""UnaryOp(op: OpKind, operand: AST)"""
op: t.CInt
operand: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
op: t.CInt, operand: AST | t.CPtr):
ptr: UnaryOp | t.CPtr = pool.alloc(UnaryOp.__sizeof__())
if ptr:
string.memset(ptr, 0, UnaryOp.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
op: t.CInt, operand: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.op = op
self.operand = operand
def kind(self) -> t.CInt:
return ASTKind.UnaryOp
def type_name(self) -> str:
return "UnaryOp"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "UnaryOp(op=")
pos = _emit(buf, size, pos, _op_name(self.op))
pos = _emit(buf, size, pos, ", operand=")
if self.operand is not None:
pos = self.operand.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Compare 节点
# ============================================================
class Compare(AST):
"""Compare(left: AST, ops: list[CInt], comparators: list[AST | CPtr])"""
left: AST | t.CPtr
ops: t.CPtr
comparators: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
left: AST | t.CPtr,
ops: t.CPtr,
comparators: list[AST | t.CPtr] | t.CPtr):
ptr: Compare | t.CPtr = pool.alloc(Compare.__sizeof__())
if ptr:
string.memset(ptr, 0, Compare.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
left: AST | t.CPtr,
ops: t.CPtr,
comparators: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.left = left
self.ops = ops
self.comparators = comparators
_set_parent_list(comparators, self)
def kind(self) -> t.CInt:
return ASTKind.Compare
def type_name(self) -> str:
return "Compare"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Compare(left=")
if self.left is not None:
pos = self.left.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", ops=")
pos = _dump_op_list(self.ops, buf, size, pos)
pos = _emit(buf, size, pos, ", comparators=")
pos = _dump_list(self.comparators, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Call 节点
# ============================================================
class Call(AST):
"""Call(func: AST, args: list[AST | CPtr], keywords: list[AST | CPtr])"""
func: AST | t.CPtr
args: list[AST | t.CPtr] | t.CPtr
keywords: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
func: AST | t.CPtr,
args: list[AST | t.CPtr] | t.CPtr,
keywords: list[AST | t.CPtr] | t.CPtr):
ptr: Call | t.CPtr = pool.alloc(Call.__sizeof__())
if ptr:
string.memset(ptr, 0, Call.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
func: AST | t.CPtr,
args: list[AST | t.CPtr] | t.CPtr,
keywords: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.func = func
self.args = args
self.keywords = keywords
_set_parent_list(args, self)
_set_parent_list(keywords, self)
def kind(self) -> t.CInt:
return ASTKind.Call
def type_name(self) -> str:
return "Call"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Call(func=")
if self.func is not None:
pos = self.func.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", args=")
pos = _dump_list(self.args, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# BoolOp 节点
# ============================================================
class BoolOp(AST):
"""BoolOp(op: CInt, values: list[AST | CPtr])"""
op: t.CInt
values: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
op: t.CInt,
values: list[AST | t.CPtr] | t.CPtr):
ptr: BoolOp | t.CPtr = pool.alloc(BoolOp.__sizeof__())
if ptr:
string.memset(ptr, 0, BoolOp.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
op: t.CInt,
values: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.op = op
self.values = values
_set_parent_list(values, self)
def kind(self) -> t.CInt:
return ASTKind.BoolOp
def type_name(self) -> str:
return "BoolOp"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "BoolOp(op=")
pos = _emit(buf, size, pos, _op_name(self.op))
pos = _emit(buf, size, pos, ", values=")
pos = _dump_list(self.values, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Lambda 节点
# ============================================================
class Lambda(AST):
"""Lambda(args: AST, body: AST)"""
args: AST | t.CPtr
body: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
args: AST | t.CPtr, body: AST | t.CPtr):
ptr: Lambda | t.CPtr = pool.alloc(Lambda.__sizeof__())
if ptr:
string.memset(ptr, 0, Lambda.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
args: AST | t.CPtr, body: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.args = args
self.body = body
def kind(self) -> t.CInt:
return ASTKind.Lambda
def type_name(self) -> str:
return "Lambda"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Lambda(args=")
if self.args is not None:
pos = self.args.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", body=")
if self.body is not None:
pos = self.body.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# IfExp 节点
# ============================================================
class IfExp(AST):
"""IfExp(test: AST, body: AST, orelse: AST)"""
test: AST | t.CPtr
body: AST | t.CPtr
orelse: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
test: AST | t.CPtr, body: AST | t.CPtr,
orelse: AST | t.CPtr):
ptr: IfExp | t.CPtr = pool.alloc(IfExp.__sizeof__())
if ptr:
string.memset(ptr, 0, IfExp.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
test: AST | t.CPtr, body: AST | t.CPtr,
orelse: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.test = test
self.body = body
self.orelse = orelse
def kind(self) -> t.CInt:
return ASTKind.IfExp
def type_name(self) -> str:
return "IfExp"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "IfExp(test=")
if self.test is not None:
pos = self.test.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", body=")
if self.body is not None:
pos = self.body.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", orelse=")
if self.orelse is not None:
pos = self.orelse.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Dict 节点
# ============================================================
class Dict(AST):
"""Dict(keys: list[AST | CPtr], values: list[AST | CPtr])"""
keys: list[AST | t.CPtr] | t.CPtr
values: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
keys: list[AST | t.CPtr] | t.CPtr,
values: list[AST | t.CPtr] | t.CPtr):
ptr: Dict | t.CPtr = pool.alloc(Dict.__sizeof__())
if ptr:
string.memset(ptr, 0, Dict.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
keys: list[AST | t.CPtr] | t.CPtr,
values: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.keys = keys
self.values = values
_set_parent_list(keys, self)
_set_parent_list(values, self)
def kind(self) -> t.CInt:
return ASTKind.Dict
def type_name(self) -> str:
return "Dict"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Dict(keys=")
pos = _dump_list(self.keys, buf, size, pos)
pos = _emit(buf, size, pos, ", values=")
pos = _dump_list(self.values, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Set 节点
# ============================================================
class Set(AST):
"""Set(elts: list[AST | CPtr])"""
elts: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
elts: list[AST | t.CPtr] | t.CPtr):
ptr: Set | t.CPtr = pool.alloc(Set.__sizeof__())
if ptr:
string.memset(ptr, 0, Set.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
elts: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.elts = elts
_set_parent_list(elts, self)
def kind(self) -> t.CInt:
return ASTKind.Set
def type_name(self) -> str:
return "Set"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Set(elts=")
pos = _dump_list(self.elts, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# ListComp 节点
# ============================================================
class ListComp(AST):
"""ListComp(elt: AST, generators: list[AST | CPtr])"""
elt: AST | t.CPtr
generators: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
elt: AST | t.CPtr,
generators: list[AST | t.CPtr] | t.CPtr):
ptr: ListComp | t.CPtr = pool.alloc(ListComp.__sizeof__())
if ptr:
string.memset(ptr, 0, ListComp.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
elt: AST | t.CPtr,
generators: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.elt = elt
self.generators = generators
_set_parent_list(generators, self)
def kind(self) -> t.CInt:
return ASTKind.ListComp
def type_name(self) -> str:
return "ListComp"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "ListComp(elt=")
if self.elt is not None:
pos = self.elt.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", generators=")
pos = _dump_list(self.generators, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# SetComp 节点
# ============================================================
class SetComp(AST):
"""SetComp(elt: AST, generators: list[AST | CPtr])"""
elt: AST | t.CPtr
generators: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
elt: AST | t.CPtr,
generators: list[AST | t.CPtr] | t.CPtr):
ptr: SetComp | t.CPtr = pool.alloc(SetComp.__sizeof__())
if ptr:
string.memset(ptr, 0, SetComp.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
elt: AST | t.CPtr,
generators: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.elt = elt
self.generators = generators
_set_parent_list(generators, self)
def kind(self) -> t.CInt:
return ASTKind.SetComp
def type_name(self) -> str:
return "SetComp"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "SetComp(elt=")
if self.elt is not None:
pos = self.elt.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", generators=")
pos = _dump_list(self.generators, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# DictComp 节点
# ============================================================
class DictComp(AST):
"""DictComp(key: AST, value: AST, generators: list[AST | CPtr])"""
key: AST | t.CPtr
value: AST | t.CPtr
generators: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
key: AST | t.CPtr, value: AST | t.CPtr,
generators: list[AST | t.CPtr] | t.CPtr):
ptr: DictComp | t.CPtr = pool.alloc(DictComp.__sizeof__())
if ptr:
string.memset(ptr, 0, DictComp.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
key: AST | t.CPtr, value: AST | t.CPtr,
generators: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.key = key
self.value = value
self.generators = generators
_set_parent_list(generators, self)
def kind(self) -> t.CInt:
return ASTKind.DictComp
def type_name(self) -> str:
return "DictComp"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "DictComp(key=")
if self.key is not None:
pos = self.key.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", value=")
if self.value is not None:
pos = self.value.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", generators=")
pos = _dump_list(self.generators, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# GeneratorExp 节点
# ============================================================
class GeneratorExp(AST):
"""GeneratorExp(elt: AST, generators: list[AST | CPtr])"""
elt: AST | t.CPtr
generators: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
elt: AST | t.CPtr,
generators: list[AST | t.CPtr] | t.CPtr):
ptr: GeneratorExp | t.CPtr = pool.alloc(GeneratorExp.__sizeof__())
if ptr:
string.memset(ptr, 0, GeneratorExp.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
elt: AST | t.CPtr,
generators: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.elt = elt
self.generators = generators
_set_parent_list(generators, self)
def kind(self) -> t.CInt:
return ASTKind.GeneratorExp
def type_name(self) -> str:
return "GeneratorExp"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "GeneratorExp(elt=")
if self.elt is not None:
pos = self.elt.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", generators=")
pos = _dump_list(self.generators, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Await 节点
# ============================================================
class Await(AST):
"""Await(value: AST)"""
value: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr):
ptr: Await | t.CPtr = pool.alloc(Await.__sizeof__())
if ptr:
string.memset(ptr, 0, Await.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.value = value
def kind(self) -> t.CInt:
return ASTKind.Await
def type_name(self) -> str:
return "Await"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Await(value=")
if self.value is not None:
pos = self.value.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Yield 节点
# ============================================================
class Yield(AST):
"""Yield(value: AST)"""
value: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr):
ptr: Yield | t.CPtr = pool.alloc(Yield.__sizeof__())
if ptr:
string.memset(ptr, 0, Yield.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.value = value
def kind(self) -> t.CInt:
return ASTKind.Yield
def type_name(self) -> str:
return "Yield"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Yield(value=")
if self.value is not None:
pos = self.value.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# YieldFrom 节点
# ============================================================
class YieldFrom(AST):
"""YieldFrom(value: AST)"""
value: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr):
ptr: YieldFrom | t.CPtr = pool.alloc(YieldFrom.__sizeof__())
if ptr:
string.memset(ptr, 0, YieldFrom.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.value = value
def kind(self) -> t.CInt:
return ASTKind.YieldFrom
def type_name(self) -> str:
return "YieldFrom"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "YieldFrom(value=")
if self.value is not None:
pos = self.value.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# FormattedValue 节点
# ============================================================
class FormattedValue(AST):
"""FormattedValue(value: AST, conversion: CInt, format_spec: AST)"""
value: AST | t.CPtr
conversion: t.CInt
format_spec: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
value: AST | t.CPtr, conversion: t.CInt,
format_spec: AST | t.CPtr):
ptr: FormattedValue | t.CPtr = pool.alloc(FormattedValue.__sizeof__())
if ptr:
string.memset(ptr, 0, FormattedValue.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
value: AST | t.CPtr, conversion: t.CInt,
format_spec: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.value = value
self.conversion = conversion
self.format_spec = format_spec
def kind(self) -> t.CInt:
return ASTKind.FormattedValue
def type_name(self) -> str:
return "FormattedValue"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "FormattedValue(value=")
if self.value is not None:
pos = self.value.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", conversion=")
pos = _emit_int(buf, size, pos, t.CInt64T(self.conversion))
pos = _emit(buf, size, pos, ", format_spec=")
if self.format_spec is not None:
pos = self.format_spec.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# JoinedStr 节点
# ============================================================
class JoinedStr(AST):
"""JoinedStr(values: list[AST | CPtr])"""
values: list[AST | t.CPtr] | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
values: list[AST | t.CPtr] | t.CPtr):
ptr: JoinedStr | t.CPtr = pool.alloc(JoinedStr.__sizeof__())
if ptr:
string.memset(ptr, 0, JoinedStr.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
values: list[AST | t.CPtr] | t.CPtr):
_init_ast(self, pool, 0, 0)
self.values = values
_set_parent_list(values, self)
def kind(self) -> t.CInt:
return ASTKind.JoinedStr
def type_name(self) -> str:
return "JoinedStr"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "JoinedStr(values=")
pos = _dump_list(self.values, buf, size, pos)
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Attribute 节点
# ============================================================
class Attribute(AST):
"""Attribute(value: AST, attr: str, ctx: CInt)"""
value: AST | t.CPtr
attr: str
ctx: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
value: AST | t.CPtr, attr: str, ctx: t.CInt):
ptr: Attribute | t.CPtr = pool.alloc(Attribute.__sizeof__())
if ptr:
string.memset(ptr, 0, Attribute.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
value: AST | t.CPtr, attr: str, ctx: t.CInt):
_init_ast(self, pool, 0, 0)
self.value = value
self.attr = _copy_str(pool, attr)
self.ctx = ctx
def kind(self) -> t.CInt:
return ASTKind.Attribute
def type_name(self) -> str:
return "Attribute"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Attribute(value=")
if self.value is not None:
pos = self.value.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", attr='")
pos = _emit_str(buf, size, pos, self.attr)
pos = _emit(buf, size, pos, "', ctx=")
pos = _emit_int(buf, size, pos, t.CInt64T(self.ctx))
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Subscript 节点
# ============================================================
class Subscript(AST):
"""Subscript(value: AST, slice: AST, ctx: CInt)"""
value: AST | t.CPtr
slice: AST | t.CPtr
ctx: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
value: AST | t.CPtr, slice: AST | t.CPtr, ctx: t.CInt):
ptr: Subscript | t.CPtr = pool.alloc(Subscript.__sizeof__())
if ptr:
string.memset(ptr, 0, Subscript.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
value: AST | t.CPtr, slice: AST | t.CPtr, ctx: t.CInt):
_init_ast(self, pool, 0, 0)
self.value = value
self.slice = slice
self.ctx = ctx
def kind(self) -> t.CInt:
return ASTKind.Subscript
def type_name(self) -> str:
return "Subscript"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Subscript(value=")
if self.value is not None:
pos = self.value.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", slice=")
if self.slice is not None:
pos = self.slice.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", ctx=")
pos = _emit_int(buf, size, pos, t.CInt64T(self.ctx))
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Starred 节点
# ============================================================
class Starred(AST):
"""Starred(value: AST, ctx: CInt)"""
value: AST | t.CPtr
ctx: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
value: AST | t.CPtr, ctx: t.CInt):
ptr: Starred | t.CPtr = pool.alloc(Starred.__sizeof__())
if ptr:
string.memset(ptr, 0, Starred.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
value: AST | t.CPtr, ctx: t.CInt):
_init_ast(self, pool, 0, 0)
self.value = value
self.ctx = ctx
def kind(self) -> t.CInt:
return ASTKind.Starred
def type_name(self) -> str:
return "Starred"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Starred(value=")
if self.value is not None:
pos = self.value.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", ctx=")
pos = _emit_int(buf, size, pos, t.CInt64T(self.ctx))
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# List 节点
# ============================================================
class List(AST):
"""List(elts: list[AST | CPtr], ctx: CInt)"""
elts: list[AST | t.CPtr] | t.CPtr
ctx: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
elts: list[AST | t.CPtr] | t.CPtr, ctx: t.CInt):
ptr: List | t.CPtr = pool.alloc(List.__sizeof__())
if ptr:
string.memset(ptr, 0, List.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
elts: list[AST | t.CPtr] | t.CPtr, ctx: t.CInt):
_init_ast(self, pool, 0, 0)
self.elts = elts
self.ctx = ctx
_set_parent_list(elts, self)
def kind(self) -> t.CInt:
return ASTKind.List
def type_name(self) -> str:
return "List"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "List(elts=")
pos = _dump_list(self.elts, buf, size, pos)
pos = _emit(buf, size, pos, ", ctx=")
pos = _emit_int(buf, size, pos, t.CInt64T(self.ctx))
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Tuple 节点
# ============================================================
class Tuple(AST):
"""Tuple(elts: list[AST | CPtr], ctx: CInt)"""
elts: list[AST | t.CPtr] | t.CPtr
ctx: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr,
elts: list[AST | t.CPtr] | t.CPtr, ctx: t.CInt):
ptr: Tuple | t.CPtr = pool.alloc(Tuple.__sizeof__())
if ptr:
string.memset(ptr, 0, Tuple.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
elts: list[AST | t.CPtr] | t.CPtr, ctx: t.CInt):
_init_ast(self, pool, 0, 0)
self.elts = elts
self.ctx = ctx
_set_parent_list(elts, self)
def kind(self) -> t.CInt:
return ASTKind.Tuple
def type_name(self) -> str:
return "Tuple"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Tuple(elts=")
pos = _dump_list(self.elts, buf, size, pos)
pos = _emit(buf, size, pos, ", ctx=")
pos = _emit_int(buf, size, pos, t.CInt64T(self.ctx))
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# Slice 节点
# ============================================================
class Slice(AST):
"""Slice(lower: AST, upper: AST, step: AST)"""
lower: AST | t.CPtr
upper: AST | t.CPtr
step: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
lower: AST | t.CPtr, upper: AST | t.CPtr,
step: AST | t.CPtr):
ptr: Slice | t.CPtr = pool.alloc(Slice.__sizeof__())
if ptr:
string.memset(ptr, 0, Slice.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
lower: AST | t.CPtr, upper: AST | t.CPtr,
step: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.lower = lower
self.upper = upper
self.step = step
def kind(self) -> t.CInt:
return ASTKind.Slice
def type_name(self) -> str:
return "Slice"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "Slice(lower=")
if self.lower is not None:
pos = self.lower.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", upper=")
if self.upper is not None:
pos = self.upper.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", step=")
if self.step is not None:
pos = self.step.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# NamedExpr 节点
# ============================================================
class NamedExpr(AST):
"""NamedExpr(target: AST, value: AST)"""
target: AST | t.CPtr
value: AST | t.CPtr
def __new__(self, pool: memhub.MemManager | t.CPtr,
target: AST | t.CPtr, value: AST | t.CPtr):
ptr: NamedExpr | t.CPtr = pool.alloc(NamedExpr.__sizeof__())
if ptr:
string.memset(ptr, 0, NamedExpr.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr,
target: AST | t.CPtr, value: AST | t.CPtr):
_init_ast(self, pool, 0, 0)
self.target = target
self.value = value
def kind(self) -> t.CInt:
return ASTKind.NamedExpr
def type_name(self) -> str:
return "NamedExpr"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "NamedExpr(target=")
if self.target is not None:
pos = self.target.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ", value=")
if self.value is not None:
pos = self.value.dump(buf, size, pos)
else:
pos = _emit(buf, size, pos, "None")
pos = _emit(buf, size, pos, ")")
return pos
# ============================================================
# OpNode 节点
# ============================================================
class OpNode(AST):
"""OpNode(op: CInt)"""
op: t.CInt
def __new__(self, pool: memhub.MemManager | t.CPtr, op: t.CInt):
ptr: OpNode | t.CPtr = pool.alloc(OpNode.__sizeof__())
if ptr:
string.memset(ptr, 0, OpNode.__sizeof__())
return ptr
def __init__(self, pool: memhub.MemManager | t.CPtr, op: t.CInt):
_init_ast(self, pool, 0, 0)
self.op = op
def kind(self) -> t.CInt:
return ASTKind.OpNode
def type_name(self) -> str:
return "OpNode"
def dump(self, buf: t.CChar | t.CPtr, size: t.CSizeT,
pos: t.CSizeT) -> t.CSizeT:
pos = _emit(buf, size, pos, "OpNode(op=")
pos = _emit(buf, size, pos, _op_name(self.op))
pos = _emit(buf, size, pos, ")")
return pos