feat(ast): 结构化 Stmt/Expr 中间基类(isinstance 分类支持)

- base.vp 新增 Stmt/Expr(CVTable,继承 AST),__init__.vp 导出
- stmts.vp 23 个语句类继承 Stmt,exprs.vp 27 个表达式类继承 Expr
- 顶层/辅助/模式/OpNode 保持 AST 直继承(非 Stmt 非 Expr)
This commit is contained in:
TermiNexus committed 2026-08-10 21:48:41 +08:00
1 parent 9c2dc45c03
commit 2120a0a4ab
4 files changed
+79 -53

No files matched your search

+1 -1
View File
@@ -9,7 +9,7 @@ from .tokens import (
)
# Common Section: Base Classes, Enums, Constants, Helper Functions, Dump
from .base import (
AST, ASTKind, ASTCtx, OpKind, ASTFlag,
AST, Stmt, Expr, ASTKind, ASTCtx, OpKind, ASTFlag,
# Constants
CONST_INT, CONST_FLOAT, CONST_STR, CONST_BOOL, CONST_NONE, CONST_CHAR,
FLAG_IS_ASYNC, FLAG_SIMPLE, FLAG_HAS_STAR,
+26
View File
@@ -457,6 +457,32 @@ class AST:
_append_child(self.children, node, self.pool)
# ============================================================
# Stmt - Statement Base Class
#
# 所有语句节点(Assign/If/For/While/Return/...)继承 Stmt。
# isinstance(node, ast.Stmt) 可在运行时区分"语句"与"表达式"
# (依赖 TPV isinstance 子类集合判定 + 三层 vtable 继承)。
# 不 override kind()(继承 AST 的 0),具体节点各自返回 ASTKind 值。
# ============================================================
@t.CVTable
class Stmt(AST):
"""语句节点基类(Assign/If/For/While/Return/...)"""
# ============================================================
# Expr - Expression Base Class
#
# 所有表达式节点(Name/Constant/Call/BinOp/...)继承 Expr。
# isinstance(node, ast.Expr) 可在运行时区分"表达式"与"语句"。
# ============================================================
@t.CVTable
class Expr(AST):
"""表达式节点基类(Name/Constant/Call/BinOp/...)"""
# ============================================================
# Module dump function (for ast.dump(node, buf, size))
# ============================================================
+28 -28
View File
@@ -3,7 +3,7 @@ from stdint import *
import memhub
import string
from .base import (
AST, ASTKind, ASTCtx, OpKind,
AST, Expr, 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, CONST_CHAR
@@ -14,7 +14,7 @@ from .base import (
# Name node
# ============================================================
class Name(AST):
class Name(Expr):
"""Name(id: str, ctx: ASTCtx)"""
id: str
ctx: t.CInt
@@ -57,7 +57,7 @@ class Name(AST):
# Constant nodes (subtype marked by const_kind)
# ============================================================
class Constant(AST):
class Constant(Expr):
"""Constant(int_val/float_val/str_val, const_kind)"""
int_val: t.CInt64T
float_val: t.CDouble
@@ -126,7 +126,7 @@ class Constant(AST):
# BinOp Node
# ============================================================
class BinOp(AST):
class BinOp(Expr):
"""BinOp(left: AST, op: OpKind, right: AST)"""
left: AST | t.CPtr
op: t.CInt
@@ -174,7 +174,7 @@ class BinOp(AST):
# UnaryOp Node
# ============================================================
class UnaryOp(AST):
class UnaryOp(Expr):
"""UnaryOp(op: OpKind, operand: AST)"""
op: t.CInt
operand: AST | t.CPtr
@@ -215,7 +215,7 @@ class UnaryOp(AST):
# Compare Node
# ============================================================
class Compare(AST):
class Compare(Expr):
"""Compare(left: AST, ops: list[CInt], comparators: list[AST | CPtr])"""
left: AST | t.CPtr
ops: t.CPtr
@@ -265,7 +265,7 @@ class Compare(AST):
# Call Node
# ============================================================
class Call(AST):
class Call(Expr):
"""Call(func: AST, args: list[AST | CPtr], keywords: list[AST | CPtr])"""
func: AST | t.CPtr
args: list[AST | t.CPtr] | t.CPtr
@@ -314,7 +314,7 @@ class Call(AST):
# BoolOp Node
# ============================================================
class BoolOp(AST):
class BoolOp(Expr):
"""BoolOp(op: CInt, values: list[AST | CPtr])"""
op: t.CInt
values: list[AST | t.CPtr] | t.CPtr
@@ -355,7 +355,7 @@ class BoolOp(AST):
# Lambda Node
# ============================================================
class Lambda(AST):
class Lambda(Expr):
"""Lambda(args: AST, body: AST)"""
args: AST | t.CPtr
body: AST | t.CPtr
@@ -399,7 +399,7 @@ class Lambda(AST):
# IfExp Node
# ============================================================
class IfExp(AST):
class IfExp(Expr):
"""IfExp(test: AST, body: AST, orelse: AST)"""
test: AST | t.CPtr
body: AST | t.CPtr
@@ -452,7 +452,7 @@ class IfExp(AST):
# Dict Node
# ============================================================
class Dict(AST):
class Dict(Expr):
"""Dict(keys: list[AST | CPtr], values: list[AST | CPtr])"""
keys: list[AST | t.CPtr] | t.CPtr
values: list[AST | t.CPtr] | t.CPtr
@@ -494,7 +494,7 @@ class Dict(AST):
# Set Node
# ============================================================
class Set(AST):
class Set(Expr):
"""Set(elts: list[AST | CPtr])"""
elts: list[AST | t.CPtr] | t.CPtr
@@ -529,7 +529,7 @@ class Set(AST):
# ListComp Node
# ============================================================
class ListComp(AST):
class ListComp(Expr):
"""ListComp(elt: AST, generators: list[AST | CPtr])"""
elt: AST | t.CPtr
generators: list[AST | t.CPtr] | t.CPtr
@@ -573,7 +573,7 @@ class ListComp(AST):
# SetComp Node
# ============================================================
class SetComp(AST):
class SetComp(Expr):
"""SetComp(elt: AST, generators: list[AST | CPtr])"""
elt: AST | t.CPtr
generators: list[AST | t.CPtr] | t.CPtr
@@ -617,7 +617,7 @@ class SetComp(AST):
# DictComp Node
# ============================================================
class DictComp(AST):
class DictComp(Expr):
"""DictComp(key: AST, value: AST, generators: list[AST | CPtr])"""
key: AST | t.CPtr
value: AST | t.CPtr
@@ -668,7 +668,7 @@ class DictComp(AST):
# GeneratorExp Node
# ============================================================
class GeneratorExp(AST):
class GeneratorExp(Expr):
"""GeneratorExp(elt: AST, generators: list[AST | CPtr])"""
elt: AST | t.CPtr
generators: list[AST | t.CPtr] | t.CPtr
@@ -712,7 +712,7 @@ class GeneratorExp(AST):
# Await Node
# ============================================================
class Await(AST):
class Await(Expr):
"""Await(value: AST)"""
value: AST | t.CPtr
@@ -747,7 +747,7 @@ class Await(AST):
# Yield Node
# ============================================================
class Yield(AST):
class Yield(Expr):
"""Yield(value: AST)"""
value: AST | t.CPtr
@@ -782,7 +782,7 @@ class Yield(AST):
# YieldFrom Node
# ============================================================
class YieldFrom(AST):
class YieldFrom(Expr):
"""YieldFrom(value: AST)"""
value: AST | t.CPtr
@@ -817,7 +817,7 @@ class YieldFrom(AST):
# FormattedValue Node
# ============================================================
class FormattedValue(AST):
class FormattedValue(Expr):
"""FormattedValue(value: AST, conversion: CInt, format_spec: AST)"""
value: AST | t.CPtr
conversion: t.CInt
@@ -867,7 +867,7 @@ class FormattedValue(AST):
# JoinedStr Node
# ============================================================
class JoinedStr(AST):
class JoinedStr(Expr):
"""JoinedStr(values: list[AST | CPtr])"""
values: list[AST | t.CPtr] | t.CPtr
@@ -902,7 +902,7 @@ class JoinedStr(AST):
# Attribute Node
# ============================================================
class Attribute(AST):
class Attribute(Expr):
"""Attribute(value: AST, attr: str, ctx: CInt)"""
value: AST | t.CPtr
attr: str
@@ -947,7 +947,7 @@ class Attribute(AST):
# Subscript Node
# ============================================================
class Subscript(AST):
class Subscript(Expr):
"""Subscript(value: AST, slice: AST, ctx: CInt)"""
value: AST | t.CPtr
slice: AST | t.CPtr
@@ -995,7 +995,7 @@ class Subscript(AST):
# Starred Node
# ============================================================
class Starred(AST):
class Starred(Expr):
"""Starred(value: AST, ctx: CInt)"""
value: AST | t.CPtr
ctx: t.CInt
@@ -1036,7 +1036,7 @@ class Starred(AST):
# List Node
# ============================================================
class List(AST):
class List(Expr):
"""List(elts: list[AST | CPtr], ctx: CInt)"""
elts: list[AST | t.CPtr] | t.CPtr
ctx: t.CInt
@@ -1075,7 +1075,7 @@ class List(AST):
# Tuple Node
# ============================================================
class Tuple(AST):
class Tuple(Expr):
"""Tuple(elts: list[AST | CPtr], ctx: CInt)"""
elts: list[AST | t.CPtr] | t.CPtr
ctx: t.CInt
@@ -1114,7 +1114,7 @@ class Tuple(AST):
# Slice Node
# ============================================================
class Slice(AST):
class Slice(Expr):
"""Slice(lower: AST, upper: AST, step: AST)"""
lower: AST | t.CPtr
upper: AST | t.CPtr
@@ -1167,7 +1167,7 @@ class Slice(AST):
# NamedExpr Node
# ============================================================
class NamedExpr(AST):
class NamedExpr(Expr):
"""NamedExpr(target: AST, value: AST)"""
target: AST | t.CPtr
value: AST | t.CPtr
+24 -24
View File
@@ -3,7 +3,7 @@ from stdint import *
import memhub
import string
from .base import (
AST, ASTKind, ASTCtx, OpKind,
AST, Stmt, ASTKind, ASTCtx, OpKind,
_init_ast, _copy_str, _set_parent_list,
_emit, _emit_str, _emit_int, _dump_list,
FLAG_IS_ASYNC,
@@ -45,7 +45,7 @@ class Module(AST):
# Assign Node
# ============================================================
class Assign(AST):
class Assign(Stmt):
"""Assign(targets: list[AST | t.CPtr], value: AST)"""
targets: list[AST | t.CPtr] | t.CPtr
value: AST | t.CPtr
@@ -87,7 +87,7 @@ class Assign(AST):
# If Node
# ============================================================
class If(AST):
class If(Stmt):
"""If(test: AST, orelse: list[AST | t.CPtr])"""
test: AST | t.CPtr
orelse: list[AST | t.CPtr] | t.CPtr
@@ -133,7 +133,7 @@ class If(AST):
# For Node
# ============================================================
class For(AST):
class For(Stmt):
"""For(target: AST, iter: AST, orelse: list[AST | t.CPtr], is_async: CInt)"""
target: AST | t.CPtr
iter: AST | t.CPtr
@@ -191,7 +191,7 @@ class For(AST):
# While Node
# ============================================================
class While(AST):
class While(Stmt):
"""While(test: AST, orelse: list[AST | t.CPtr])"""
test: AST | t.CPtr
orelse: list[AST | t.CPtr] | t.CPtr
@@ -235,7 +235,7 @@ class While(AST):
# Return Node
# ============================================================
class Return(AST):
class Return(Stmt):
"""Return(value: AST | None)"""
value: AST | t.CPtr
@@ -270,7 +270,7 @@ class Return(AST):
# Expr Node (expression statement)
# ============================================================
class Expr(AST):
class Expr(Stmt):
"""Expr(value: AST)"""
value: AST | t.CPtr
@@ -305,7 +305,7 @@ class Expr(AST):
# FunctionDef Node
# ============================================================
class FunctionDef(AST):
class FunctionDef(Stmt):
"""FunctionDef(name: str, args: AST,
decorator_list: list[AST | t.CPtr], returns: AST, flags: CInt,
type_params: list[str] | t.CPtr = None)
@@ -494,7 +494,7 @@ class FunctionType(AST):
# ClassDef Node
# ============================================================
class ClassDef(AST):
class ClassDef(Stmt):
"""ClassDef(name: str, bases: list[AST | t.CPtr], keywords: list[AST | t.CPtr],
decorator_list: list[AST | t.CPtr], type_params: list[str] | t.CPtr)
@@ -557,7 +557,7 @@ class ClassDef(AST):
# Delete Node
# ============================================================
class Delete(AST):
class Delete(Stmt):
"""Delete(targets: list[AST | t.CPtr])"""
targets: list[AST | t.CPtr] | t.CPtr
@@ -592,7 +592,7 @@ class Delete(AST):
# AugAssign Node
# ============================================================
class AugAssign(AST):
class AugAssign(Stmt):
"""AugAssign(target: AST, op: CInt, value: AST)"""
target: AST | t.CPtr
op: t.CInt
@@ -640,7 +640,7 @@ class AugAssign(AST):
# AnnAssign Node
# ============================================================
class AnnAssign(AST):
class AnnAssign(Stmt):
"""AnnAssign(target: AST, annotation: AST, value: AST, simple: CInt)"""
target: AST | t.CPtr
annotation: AST | t.CPtr
@@ -697,7 +697,7 @@ class AnnAssign(AST):
# With Node
# ============================================================
class With(AST):
class With(Stmt):
"""With(items: list[AST | t.CPtr], is_async: CInt)"""
items: list[AST | t.CPtr] | t.CPtr
flags: t.CInt
@@ -741,7 +741,7 @@ class With(AST):
# Raise Node
# ============================================================
class Raise(AST):
class Raise(Stmt):
"""Raise(exc: AST, cause: AST)"""
exc: AST | t.CPtr
cause: AST | t.CPtr
@@ -785,7 +785,7 @@ class Raise(AST):
# Try Node
# ============================================================
class Try(AST):
class Try(Stmt):
"""Try(handlers: list[AST | t.CPtr],
orelse: list[AST | t.CPtr], finalbody: list[AST | t.CPtr])"""
handlers: list[AST | t.CPtr] | t.CPtr
@@ -837,7 +837,7 @@ class Try(AST):
# Assert Node
# ============================================================
class Assert(AST):
class Assert(Stmt):
"""Assert(test: AST, msg: AST)"""
test: AST | t.CPtr
msg: AST | t.CPtr
@@ -881,7 +881,7 @@ class Assert(AST):
# Global Node
# ============================================================
class Global(AST):
class Global(Stmt):
"""Global(names: list[AST | t.CPtr])"""
names: list[AST | t.CPtr] | t.CPtr
@@ -916,7 +916,7 @@ class Global(AST):
# Nonlocal Node
# ============================================================
class Nonlocal(AST):
class Nonlocal(Stmt):
"""Nonlocal(names: list[AST | t.CPtr])"""
names: list[AST | t.CPtr] | t.CPtr
@@ -951,7 +951,7 @@ class Nonlocal(AST):
# Pass Node
# ============================================================
class Pass(AST):
class Pass(Stmt):
"""Pass()"""
def __new__(self, pool: memhub.MemManager | t.CPtr):
@@ -979,7 +979,7 @@ class Pass(AST):
# Break Node
# ============================================================
class Break(AST):
class Break(Stmt):
"""Break()"""
def __new__(self, pool: memhub.MemManager | t.CPtr):
@@ -1007,7 +1007,7 @@ class Break(AST):
# Continue Node
# ============================================================
class Continue(AST):
class Continue(Stmt):
"""Continue()"""
def __new__(self, pool: memhub.MemManager | t.CPtr):
@@ -1035,7 +1035,7 @@ class Continue(AST):
# Import Node
# ============================================================
class Import(AST):
class Import(Stmt):
"""Import(names: list[AST | t.CPtr])"""
names: list[AST | t.CPtr] | t.CPtr
@@ -1070,7 +1070,7 @@ class Import(AST):
# ImportFrom Node
# ============================================================
class ImportFrom(AST):
class ImportFrom(Stmt):
"""ImportFrom(module: str, names: list[AST | t.CPtr], level: CInt)"""
module: str
names: list[AST | t.CPtr] | t.CPtr
@@ -1117,7 +1117,7 @@ class ImportFrom(AST):
# Match Node
# ============================================================
class Match(AST):
class Match(Stmt):
"""Match(subject: AST, cases: list[AST | t.CPtr])"""
subject: AST | t.CPtr
cases: list[AST | t.CPtr] | t.CPtr