Files
TransPyC/lib/core/SymbolData.py
T
TermiNexus 6fc9e19e24 feat(vast): 新增自研 Viper/Python 语法解析器取代标准库 ast
TPC 侧取缔对 Python 标准库 ast 模块的依赖,改用 lib/vast 包:
- Nodes: 与 CPython 3.12 ast 完全同构的 131 个节点类(含抽象基类继承)
- Tokenizer: 词法分析(缩进/字符串/f-string/数字/运算符/软关键字)
- ExprParser: 表达式递归下降解析(优先级/lambda/推导式/f-string/切片)
- Parser: 语句解析(def/class/if/for/try/with/match/import/注解)
- Utils/Unparser: walk/dump/unparse/copy_location/literal_eval 等辅助
- 软关键字 fn/fun/func/function 并入解析器, 废除 ExpandSoftKeywords 预处理
- lib/_bootstrap 将 lib 目录加入 sys.path, import vast as ast 零修改替换
- 52 个文件 import ast 替换为 import vast as ast; 94 文件差分测试 0 失败
2026-08-17 09:36:38 +08:00

86 lines
2.8 KiB
Python

"""符号表处理的数据结构:四阶段管线中传递的中间数据"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Dict, List, Optional, Tuple, TYPE_CHECKING
import vast as ast
if TYPE_CHECKING:
from lib.core.Handles.HandlesBase import CTypeInfo
@dataclass
class ClassSymbolData:
"""从 AST 提取的类符号数据"""
name: str
type_kind: str # 'struct', 'union', 'enum', 'exception'
lineno: int
members: Dict[str, CTypeInfo]
is_cpython_object: bool = False
is_packed: bool = False
enum_members: List[Tuple[str, int, int]] = field(default_factory=list) # (name, value, lineno)
@dataclass
class TypedefSymbolData:
"""Typedef 符号数据(含原始注解和解析结果)"""
name: str
lineno: int
# 原始注解数据(由 Extractor 设置,Resolver 使用)
annotation: ast.expr | None = None
value: ast.expr | int | str | float | None = None
has_cdefine: bool = False
has_postdef: bool = False
has_ctypedef: bool = False
# 解析结果(由 Resolver 设置,Inserter 使用)
original_type_kind: Optional[str] = None
original_class: type | None = None
members: Optional[Dict] = None
@dataclass
class FuncSymbolData:
"""函数符号数据(含原始注解和解析结果)"""
name: str
lineno: int
# 原始数据(由 Extractor 设置)
returns_node: ast.expr | None = None
params: List = field(default_factory=list) # [(name, annotation_node), ...]
is_variadic: bool = False
is_inline: bool = False
# 解析结果(由 Resolver 设置)
ret_type: str | None = None
param_types: List = field(default_factory=list) # [str, ...]
# 解析结果(CTypeInfo,保留符号性,由 Resolver 设置)
ret_ctype: Optional[CTypeInfo] = None
@dataclass
class DefineSymbolData:
"""Define 符号数据(含原始值和解析结果)"""
name: str
lineno: int
# 原始数据(由 Extractor 设置)
value_node: ast.expr | None = None
# 解析结果(由 Resolver 设置)
value: int | str | float | None = None
@dataclass
class AnonymousTypeData:
"""匿名类型数据"""
name: str
is_union: bool
members: Dict[str, CTypeInfo]
lineno: int
@dataclass
class ModuleSymbols:
"""从模块提取的完整符号数据,在四阶段管线中传递"""
file_path: str
classes: List[ClassSymbolData] = field(default_factory=list)
typedefs: List[TypedefSymbolData] = field(default_factory=list)
functions: List[FuncSymbolData] = field(default_factory=list)
defines: List[DefineSymbolData] = field(default_factory=list)
anonymous_types: Dict[str, AnonymousTypeData] = field(default_factory=dict)