feat(static): static 修饰符改为语句起始前置 + 新增 static def(旧的注解位置响亮失败)
vast/Parser.py:ParseStatement 与 _ParseDecorated 新增 static def 分派(判据要求第 2 个 token 是 def,故 static = 5 / static x = 5 不会被误吃成函数定义);新增 _ParseStaticDef,镜像 _ParseExportDef 但**不改写返回注解**、而是在既有装饰器之后合成 @t.CStatic SymbolUtils.py:_TYPE_DESCRIPTOR_MARKERS 删掉 static;新增 _StaticPositionSyntaxError 与 _InStaticOldAnnotationPosition,旧注解位置(名字: static 类型)一律 SyntaxError 并提示前置形式,绝不静默改写;_EXPORT_EXTERN_MODIFIERS 加入 static,_ExpandExportExternVar 新增前置分支——export/extern 追加在类型右侧(或 t.CExport / 或 t.State),static **前置在类型最左**(t.CStatic 加竖线),允许初值;数组前缀展开仍在修饰符展开之前 与 includes/ast/parser.vp 的 pending_static 通道同源:static 名字: 类型 = 值 产出与手写 名字: t.CStatic | 类型、装饰器 @t.CStatic 逐字段同形
This commit is contained in:
1 parent
f9957787a0
commit
e5a6616f8b
2 files changed
+210
-49
No files matched your search
@@ -108,6 +108,14 @@ class Parser(ExprParserMixin):
|
||||
# 必须在软关键字 def 分派之前
|
||||
if v == 'export':
|
||||
return self._ParseExportDef()
|
||||
# static 存储类软关键字(已从"注解位置"迁出为**语句起始前置**修饰符):
|
||||
# 仅 `static def 名字` 形态判定为函数定义——判据必须同时要求第二个 token
|
||||
# 是 `def`,故 `static = 5` / `static x = 5` 不会被误吃成函数定义。
|
||||
# 变量形式 `static 名字: 类型 = 值` 不在本层处理,由 SymbolUtils 的前置
|
||||
# 修饰符展开统一脱糖为 `名字: t.CStatic | 类型 = 值`。
|
||||
if (v == 'static' and self._Peek(1).Type == NAME
|
||||
and self._Peek(1).Value == 'def'):
|
||||
return self._ParseStaticDef()
|
||||
# define 宏函数定义(与 def 语义一致,返回注解自动追加 t.CDefine
|
||||
# 标记为宏函数;软关键字:仅"define + 标识符"形态才判定为函数定义,
|
||||
# 变量名/调用(define = 5、define(x))不受影响)——必须在软关键字
|
||||
@@ -565,6 +573,9 @@ class Parser(ExprParserMixin):
|
||||
return self._ParseExternDef(decorators=decorator_list)
|
||||
if tok.Type == NAME and tok.Value == 'export':
|
||||
return self._ParseExportDef(decorators=decorator_list)
|
||||
if (tok.Type == NAME and tok.Value == 'static' and self._Peek(1).Type == NAME
|
||||
and self._Peek(1).Value == 'def'):
|
||||
return self._ParseStaticDef(decorators=decorator_list)
|
||||
if tok.Type == NAME and tok.Value == 'define':
|
||||
return self._ParseDefineDef(decorators=decorator_list)
|
||||
if tok.Type == NAME and tok.Value == 'def':
|
||||
@@ -772,6 +783,63 @@ class Parser(ExprParserMixin):
|
||||
self._FixLoc(node, start)
|
||||
return node
|
||||
|
||||
def _ParseStaticDef(self, decorators: list[N.expr] | None = None) -> N.FunctionDef:
|
||||
"""解析 static 函数定义(等价 ``@t.CStatic``,与 TransPyV 的
|
||||
`_ParseStaticModified` 同源)。
|
||||
|
||||
允许语法(与 export/extern 对称,配不配 def 都一样):
|
||||
static def A(x: int) -> int: ...
|
||||
static A(x: int) -> int: ...
|
||||
|
||||
与 export/extern 的**两处不同**:
|
||||
- **不改写返回注解**(不追加 `| t.CStatic` / `| t.State`):CStatic 是
|
||||
函数属性,由下面的合成装饰器承载,返回类型语义逐字不变;
|
||||
- **合成 `@t.CStatic` 装饰器**追加在既有装饰器之后,产出与**手写
|
||||
`@t.CStatic`** 逐字段同形(decorator_list 多一个
|
||||
Attribute(Name('t', Load), 'CStatic', Load)),下游零新增判据。
|
||||
|
||||
另设自定义属性 ``Static = True`` 供 Unparser 还原 static 语法
|
||||
(镜像 Extern/Export;因 FunctionDef 的 __slots__ 槽位未含 Static 且
|
||||
补槽位需改第三个文件,此处仅在槽位存在时设置,解析不会因此中断)。
|
||||
"""
|
||||
start: Token = self._Next() # 'static'
|
||||
if self._AtName('def'):
|
||||
self._Next()
|
||||
name_tok: Token = self._ExpectName()
|
||||
type_params: list[N.AST] = []
|
||||
if self._AtOp('['):
|
||||
type_params = self._ParseTypeParams()
|
||||
args: N.arguments = self._ParseArguments()
|
||||
returns: N.expr | None = None
|
||||
if self._AtOp('->'):
|
||||
self._Next()
|
||||
returns = self._ParseTypeAnnotation()
|
||||
body: list[N.stmt] = []
|
||||
if self._AtOp(':'):
|
||||
self._Next()
|
||||
body = self._ParseSuite()
|
||||
# 合成 @t.CStatic 装饰器(追加在既有装饰器之后)
|
||||
static_attr: N.expr = N.Attribute(value=N.Name(id='t', ctx=N.Load()),
|
||||
attr='CStatic', ctx=N.Load())
|
||||
self._FixLoc(static_attr, start)
|
||||
deco_list: list[N.expr] = list(decorators or [])
|
||||
deco_list.append(static_attr)
|
||||
node: N.FunctionDef = N.FunctionDef(
|
||||
name=name_tok.Value, args=args, body=body,
|
||||
decorator_list=deco_list, returns=returns,
|
||||
type_comment=None, type_params=type_params,
|
||||
)
|
||||
# 自定义属性 Static = True 供 Unparser 还原 static 语法(镜像 Extern/Export)。
|
||||
# 注:FunctionDef 是 __slots__ 类(见 vast/Nodes.py 的 _FUNC_ATTRS,当前槽位
|
||||
# 为 Extern/Export/Define,未含 Static)——补槽位需改第三个文件(本次不许可),
|
||||
# 故仅在槽位存在时设置,避免 AttributeError 中断解析;下游对 static 函数的
|
||||
# 识别靠上面合成的 @t.CStatic 装饰器(HandlesFunctions 的存储类装饰器分支),
|
||||
# 与 virtual/novirtual 仅合成装饰器同构。
|
||||
if hasattr(type(node), 'Static'):
|
||||
node.Static = True
|
||||
self._FixLoc(node, start)
|
||||
return node
|
||||
|
||||
def _ParseDefineDef(self, decorators: list[N.expr] | None = None) -> N.FunctionDef:
|
||||
"""解析 define 宏函数定义(语法与 def 完全一致,但固定为宏函数)。
|
||||
|
||||
|
||||
Reference in new issue
Block a user