5 个新 Mixin(92 方法)承接 HandlesBody/If/While/For/Return/Nonlocal/Match/Enum/AnnAssign/AugAssign/Var/Imports/Translator/Main 的无状态函数与 _g_ 全局;15 个 Handles 模块改为一行委托(调用方零改动);Generator 组合扩展至 12 Mixin,__init__ 初始化 8 个新字段;BuildPipeline/main 注入 14 个模块 set_global_gen;修复 ImportsGenMixin 与 TypeGenMixin 的 CurrentFile 重复字段冲突(改 HandlesType 委托,延迟 import 规避循环依赖)。
188 lines
7.9 KiB
Plaintext
188 lines
7.9 KiB
Plaintext
import t, c
|
||
from stdint import *
|
||
import ast
|
||
import llvmlite
|
||
import memhub
|
||
import string
|
||
import stdio
|
||
import viperlib
|
||
import lib.core.Handles.HandlesTranslator as HT
|
||
import lib.core.Handles.HandlesExpr as HandlesExpr
|
||
import lib.core.Handles.HandlesExprCall as HandlesExprCall
|
||
import lib.core.Handles.HandlesFunctions as HandlesFunctions
|
||
import lib.core.Handles.HandlesClassDef as HandlesClassDef
|
||
import lib.core.Handles.HandlesVar as HandlesVar
|
||
|
||
|
||
# ============================================================
|
||
# HandlesBody - 语句分派(P6 对象化后的委托层)
|
||
#
|
||
# 全部模块级函数已迁移为 lib.core.Gen.StmtGenMixin 的方法,本模块
|
||
# 保留同名模块级函数作为"一行委托":延迟 import Gen 取全局单例
|
||
# (BuildPipeline/main 创建后 set_global_gen 注册),再调用 gen 的
|
||
# 对应方法。签名与旧函数完全一致,调用方零改动。
|
||
#
|
||
# 所有语句类型通过 trans.XxxH.Handle(node) 分派到对应 Handle。
|
||
# 对应 TransPyC BodyHandle.HandleBodyLlvm 的 isinstance 分派。
|
||
# ============================================================
|
||
|
||
|
||
# ============================================================
|
||
# 全局 gen 单例(模块级镜像,同 HandlesStruct 模式)
|
||
#
|
||
# 由 BuildPipeline/main 在 gen 创建后调用 set_global_gen 注入。
|
||
# 委托函数用本地 _g_gen(cast 成 Generator 类型)调
|
||
# StmtGenMixin 方法,避免函数体 import 包模块与类/模块名歧义。
|
||
# ============================================================
|
||
_g_gen: t.CVoid | t.CPtr = None
|
||
|
||
|
||
def set_global_gen(gen: t.CVoid | t.CPtr) -> None:
|
||
"""注入全局 gen 单例(BuildPipeline/main 调用)"""
|
||
global _g_gen
|
||
_g_gen = gen
|
||
|
||
|
||
# ============================================================
|
||
# 语句翻译分派
|
||
# ============================================================
|
||
def translate_stmt(trans: HT.Translator | t.CPtr,
|
||
node: ast.AST | t.CPtr) -> int:
|
||
"""翻译单条语句,返回新增的变量数(委托到 gen.translate_stmt)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.translate_stmt(trans, node)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# 翻译 Delete 语句: del obj.attr
|
||
#
|
||
# 支持 property deleter: 当目标 attr 是 @x.deleter 方法时,
|
||
# 生成 call Class.attr$del(obj)。其余目标暂不生成代码。
|
||
# ============================================================
|
||
def translate_delete(trans: HT.Translator | t.CPtr,
|
||
node: ast.AST | t.CPtr) -> int:
|
||
"""翻译 del 语句,返回 0(委托到 gen.translate_delete)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.translate_delete(trans, node)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# 翻译 Global 语句: global x, y
|
||
#
|
||
# 将 names 中的变量名加入 _global_names 集合
|
||
# ============================================================
|
||
def translate_global(trans: HT.Translator | t.CPtr,
|
||
node: ast.AST | t.CPtr) -> int:
|
||
"""翻译 global 语句:记录 global 变量名(委托到 gen.translate_global)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.translate_global(trans, node)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# 翻译 Nonlocal 语句: nonlocal x, y
|
||
#
|
||
# 将 names 中的变量名加入 _nonlocal_names 集合
|
||
# ============================================================
|
||
def translate_nonlocal(trans: HT.Translator | t.CPtr,
|
||
node: ast.AST | t.CPtr) -> int:
|
||
"""翻译 nonlocal 语句:记录 nonlocal 变量名及其类型(委托到 gen.translate_nonlocal)
|
||
|
||
类型信息通过查找父作用域的 alloca 获取(用于 env 指针数组方案的类型恢复)。
|
||
"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.translate_nonlocal(trans, node)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# 翻译表达式语句 Expr(value=Call(...))
|
||
# ============================================================
|
||
def translate_expr_stmt(trans: HT.Translator | t.CPtr,
|
||
node: ast.AST | t.CPtr) -> int:
|
||
"""翻译表达式语句(printf 调用等)(委托到 gen.translate_expr_stmt)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.translate_expr_stmt(trans, node)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# 预扫描:为局部变量提前创建 alloca
|
||
# ============================================================
|
||
def pre_scan_allocas(trans: HT.Translator | t.CPtr,
|
||
node: ast.AST | t.CPtr) -> int:
|
||
"""预扫描语句中的 AnnAssign,提前创建 alloca(委托到 gen.pre_scan_allocas)
|
||
|
||
返回新增的变量数
|
||
"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.pre_scan_allocas(trans, node)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# 预扫描:Global/Nonlocal 声明(Python 作用域语义)
|
||
#
|
||
# Python 中 global/nonlocal 声明对整个函数作用域生效,与声明
|
||
# 位置无关。必须在翻译任何赋值之前注册 global/nonlocal 名称,
|
||
# 否则 global 声明前的赋值会错误创建局部变量遮蔽全局。
|
||
# ============================================================
|
||
def pre_scan_scope_decls(trans: HT.Translator | t.CPtr,
|
||
node: ast.AST | t.CPtr) -> int:
|
||
"""预扫描 Global/Nonlocal 声明,提前注册作用域名称(委托到 gen.pre_scan_scope_decls)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.pre_scan_scope_decls(trans, node)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# 翻译 break 语句
|
||
# ============================================================
|
||
def translate_break(trans: HT.Translator | t.CPtr) -> int:
|
||
"""翻译 break 语句:跳转到循环 end 块(委托到 gen.translate_break)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.translate_break(trans)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# 翻译 continue 语句
|
||
# ============================================================
|
||
def translate_continue(trans: HT.Translator | t.CPtr) -> int:
|
||
"""翻译 continue 语句:跳转到循环 cond/incr 块(委托到 gen.translate_continue)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.translate_continue(trans)
|
||
return 0
|
||
|
||
|
||
# ============================================================
|
||
# 获取语句类型名(调试用)
|
||
# ============================================================
|
||
def get_stmt_kind_name(node: ast.AST | t.CPtr) -> str:
|
||
"""获取语句类型名(委托到 gen.get_stmt_kind_name)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.get_stmt_kind_name(node)
|
||
return None
|