From 8d27747c7c2dff6a71d464b9d8a9bbdd67b4293a Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 17 Oct 2026 23:39:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=20tls=20=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E5=AD=97=EF=BC=8C=E5=85=A8=E9=9D=A2=E5=87=86=E5=A4=87=E6=B8=85?= =?UTF-8?q?=E9=80=80=20t,=20c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/vast/Parser.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/lib/vast/Parser.py b/lib/vast/Parser.py index b30598a..b701153 100644 --- a/lib/vast/Parser.py +++ b/lib/vast/Parser.py @@ -62,6 +62,12 @@ _VIRTUAL_EXAMPLE: str = ( 'novirtual class B: novirtual def helper(self) -> int: ...' ) +# tls 修饰符(软关键字):`tls def f(...)` ⇒ 合成既有装饰器 `@t.TLS` +#(一次性初始化守卫,见 HandlesFunctions 的 TLS 分支)。与 virtual/novirtual 同一套 +# "软关键字 + 合成既有装饰器"表示,不新增第二套语义;只在语句起始且后随 def 时生效, +# 故 `tls: local = local()` / `tls.set(...)` 等把 tls 当标识符的写法逐字不变。 +_TLS_KEYWORD: str = 'tls' + # ====================================================================== # struct 纯数据类型定义关键字(软关键字) # ====================================================================== @@ -189,6 +195,9 @@ class Parser(ExprParserMixin): # 故 `virtual fn m()` 在此已是 `virtual def m()`;本层只认 class/def。 if v in _VIRTUAL_MARKERS: return self._ParseVirtualModified() + # tls 修饰符(软关键字):语句起始 + 紧跟 def 时生效,合成既有装饰器 @t.TLS。 + if v == _TLS_KEYWORD and self._IsTlsDefStart(): + return self._ParseTlsModified() # 软关键字函数定义:fn/fun/func/function + 标识符 if v in SOFT_KEYWORDS and self._Peek(1).Type == NAME: return self._ParseFunctionDef() @@ -715,6 +724,9 @@ class Parser(ExprParserMixin): if tok.Type == NAME and tok.Value in _VIRTUAL_MARKERS: # `@deco` 与 `virtual class`/`virtual def` 组合:合成标记追加在既有装饰器之后 return self._ParseVirtualModified(decorators=decorator_list) + if tok.Type == NAME and tok.Value == _TLS_KEYWORD and self._IsTlsDefStart(): + # `@deco` 与 `tls def` 组合:合成 @t.TLS 追加在既有装饰器之后 + return self._ParseTlsModified(decorators=decorator_list) raise SyntaxError(f"decorator must be followed by def/class, got {tok.Value!r}") # ================================================================== @@ -796,6 +808,37 @@ class Parser(ExprParserMixin): return self._ParseClassDef(decorators=deco_list) return self._ParseFunctionDef(decorators=deco_list) + # ================================================================== + # tls 修饰符 + def + # ================================================================== + def _IsTlsDefStart(self) -> bool: + """下一个 token 是否为 `tls` 修饰符后的函数定义起点(def / 其别名 + '(' / '[')。""" + nxt: Token = self._Peek(1) + if nxt.Type != NAME: + return False + if nxt.Value == 'def': + return True + if nxt.Value in _DEF_ALIASES: + nxt2: Token = self._Peek(2) + return nxt2.Type == OP and nxt2.Value in ('(', '[') + return False + + def _ParseTlsModified(self, decorators: list[N.expr] | None = None) -> N.stmt: + """`tls def f(...)`:消费 tls,合成 `@t.TLS` 后交给 _ParseFunctionDef。 + + 与手写 `@t.TLS` 逐字段同形(decorator_list 追加 + Attribute(Name('t', Load), 'TLS', Load)),故下游一次性初始化的守卫生成路径 + (HandlesFunctions 的 TLS 分支)零新增判据。tls 对方法与模块级函数同样生效。 + """ + mod: Token = self._Peek() # tls + self._Next() # 消费修饰符 + deco: N.expr = N.Attribute(value=N.Name(id='t', ctx=N.Load()), + attr='TLS', ctx=N.Load()) + self._FixLoc(deco, mod) + deco_list: list[N.expr] = list(decorators or []) + deco_list.append(deco) + return self._ParseFunctionDef(decorators=deco_list) + # ================================================================== # struct 纯数据类型定义(软关键字:`struct X:` / `struct X(Base):`) # ==================================================================