From 305242aa8af6b1cb6e9353cc3465c188a617baa1 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 5 Oct 2026 20:36:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(parse):=20typedef=20=E5=8F=B3=E5=80=BC?= =?UTF-8?q?=E7=BA=B3=E5=85=A5=E7=B1=BB=E5=9E=8B=E4=BD=8D=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20const=20T=20/=20T*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X: t.CTypedef = const str / = const uint16* 现按类型位解析(含 typedef X = T 语法糖): - 文本层:_ExpandTypeDescriptors 新增 _IsTypedefAnnotationRhs(= 右侧且语句含 CTypedef); - 解析层:vast.Parser._TryParseAnnAssign 对 CTypedef 注解的右值走 _ParseTypeAnnotation,vast_c.c 同步并重建 _parser.pyd; - 文本回退:TypeAnnotationResolver._NormalizeTypedefRhsText 把 const T / T* 归一为 | 联合; - 值解析:LLVMTypeMapper.resolve_typedef_value_type 把 CConst/CVolatile 限定符标记视为无类型(_TYPEDEF_VALUE_QUALIFIERS),修 const str 被误解析成 CConst * 导致 LPCSTR 登记失败。 --- lib/core/LLVMTypeMapper.py | 37 ++++++++++++++----- lib/core/SymbolUtils.py | 55 ++++++++++++++++++++++++++++- lib/core/TypeAnnotationResolver.py | 35 ++++++++++++++++-- lib/vast/Parser.py | 33 +++++++++++++++-- lib/vast_c/_parser.pyd | Bin 220943 -> 221753 bytes lib/vast_c/vast_c.c | 50 ++++++++++++++++++++++++-- 6 files changed, 195 insertions(+), 15 deletions(-) diff --git a/lib/core/LLVMTypeMapper.py b/lib/core/LLVMTypeMapper.py index d96b093..9e5cd41 100644 --- a/lib/core/LLVMTypeMapper.py +++ b/lib/core/LLVMTypeMapper.py @@ -26,6 +26,13 @@ from lib.includes import t as _t from lib.includes.t import CTypeRegistry +# typedef 值位置的类型限定符标记:它们自身不是类型(名下有 const/volatile 语义, +# 由注解解析器累积),在 typedef 值里只修饰 `|` 另一侧。历史写法 +# `t.CConst | char | t.CPtr` 恰好被 `char` 一侧掩盖;新语法 `const str` +# (= `t.CConst | str`)暴露了这一点,故显式判为"无类型信息"。 +_TYPEDEF_VALUE_QUALIFIERS: frozenset[str] = frozenset({'CConst', 'CVolatile'}) + + class TypeNameUnresolvedError(NameError): """类型注解名无法解析(fail-fast,取代旧的"warn + 回退 i32")。 @@ -208,6 +215,12 @@ class LLVMTypeMapper: # 直接判断属性名是否为 CPtr(消除对 CName=='*' 的依赖) if node.attr == 'CPtr': return 'ptr' + if node.attr in _TYPEDEF_VALUE_QUALIFIERS: + # 类型限定符标记(const/volatile)本身不是类型:它只修饰 `|` 另一侧。 + # 旧写法 `t.CConst | char | t.CPtr` 靠 char 一侧掩盖了这一点;一旦写成 + # `t.CConst | str`(`const str`),把 'CConst' 当基类型会得到 'CConst *', + # 于是别名登记失败、所有使用处报「裸名 … 无法解析为类型」。 + return '' CName: str | None = CTypeHelper.GetCName(node.attr) if CName == 'CPtr': return 'ptr' @@ -217,15 +230,23 @@ class LLVMTypeMapper: if isinstance(node, ast.BinOp) and isinstance(node.op, ast.BitOr): left_str: str = self.resolve_typedef_value_type(node.left) right_str: str = self.resolve_typedef_value_type(node.right) - if right_str == 'ptr' or (right_str and right_str.endswith('*')): - base: str = left_str if left_str and left_str != 'ptr' else '' - return base + ' *' if base else 'void *' - if left_str == 'ptr' or (left_str and left_str.endswith('*')): - base: str = right_str if right_str and right_str != 'ptr' else '' - return base + ' *' if base else 'void *' - if right_str and right_str not in ('ptr', 'void', 'i32', 'i64'): + # 限定符侧解析为空串 ⇒ 另一侧就是完整类型(见 _TYPEDEF_VALUE_QUALIFIERS)。 + # 只在两侧都有类型信息时才按"基类型 + 指针标记"合并。 + if not left_str: + return 'void *' if right_str == 'ptr' else right_str + if not right_str: + return 'void *' if left_str == 'ptr' else left_str + if right_str == 'ptr' or right_str.endswith('*'): + if left_str != 'ptr': + return left_str + ' *' + return right_str if right_str.endswith('*') else 'void *' + if left_str == 'ptr' or left_str.endswith('*'): + if right_str != 'ptr': + return right_str + ' *' + return left_str if left_str.endswith('*') else 'void *' + if right_str not in ('ptr', 'void', 'i32', 'i64'): return right_str - if left_str and left_str not in ('ptr', 'void', 'i32', 'i64'): + if left_str not in ('ptr', 'void', 'i32', 'i64'): return left_str return left_str if left_str else right_str return '' diff --git a/lib/core/SymbolUtils.py b/lib/core/SymbolUtils.py index c1198e7..2261037 100644 --- a/lib/core/SymbolUtils.py +++ b/lib/core/SymbolUtils.py @@ -449,6 +449,54 @@ def _StaticPositionSyntaxError(Lineno: int, Col: int, Snippet: str) -> SyntaxErr ) +_TYPEDEF_RHS_SCAN_LIMIT: int = 256 + + +def _IsTypedefAnnotationRhs(Tokens: list, EqIdx: int) -> bool: + """`EqIdx` 处的 `=` 是否是 `名字: <含 CTypedef 的注解> = <类型>` 的赋值号。 + + 用途:把 `t.CTypedef` 注解的**右值**也纳入类型位置,使 + `LPCSTR: t.CTypedef = const str` / `= const uint16*` 里的描述符被展开 + (与注解位同一展开规则;右值的 `T*` 后缀由 vast 的 _ParseTypeAnnotation 处理)。 + + 判据:从 `=` 反向扫描到**深度 0 的 `:`**(跳过注释/NL,遇换行/`;` 即视为非声明行), + 再确认 `:` 与 `=` 之间出现 NAME `CTypedef`。故 `x: int = const`(值恰为标识符 const)、 + `d = {"k": const}`、`f = lambda x: t.CTypedef` 等一律不受影响。 + """ + if EqIdx < 0 or EqIdx >= len(Tokens): + return False + depth: int = 0 + colon_idx: int = -1 + j: int = EqIdx - 1 + steps: int = 0 + while j >= 0 and steps < _TYPEDEF_RHS_SCAN_LIMIT: + steps += 1 + tok = Tokens[j] + if tok.type in (tokenize.NL, tokenize.COMMENT): + j -= 1 + continue + if tok.type in (tokenize.NEWLINE, tokenize.INDENT, tokenize.DEDENT) or tok.string == ';': + return False + if tok.type == tokenize.OP: + if tok.string in (')', ']', '}'): + depth += 1 + elif tok.string in ('(', '[', '{'): + if depth == 0: + return False + depth -= 1 + elif tok.string == ':' and depth == 0: + colon_idx = j + break + j -= 1 + if colon_idx < 0: + return False + for k in range(colon_idx + 1, EqIdx): + tk = Tokens[k] + if tk.type == tokenize.NAME and tk.string == 'CTypedef': + return True + return False + + def _InStaticOldAnnotationPosition(Tokens: list, Index: int) -> bool: """`Index` 处的 `static` 是否处于**旧**注解位置(`名字: static 类型` / `-> static 类型`)。 @@ -1103,7 +1151,8 @@ def _ExpandTypeDescriptors(Code: str) -> str: """把 `const T` / `volatile T`(含组合、任意顺序)展开为 `t.CConst | T` 等形态(行号不变)。 - 词法级切分(`tokenize`):注释/字符串内容天然不参与,不会被误改写。 - - 只在"注解位置"(前一个 token 是 `:` 且再前一个是 Name,或前一个 token 是 `->`) + - 只在"注解位置"(前一个 token 是 `:` 且再前一个是 Name,或前一个 token 是 `->`, + 或 `名字: t.CTypedef =` 的赋值号右侧,见 _IsTypedefAnnotationRhs) 识别描述符串;非类型位置原样保留为普通标识符(软关键字边界)。 - **`static` 不再属于本展开器**(已迁出注解位置):注解位置出现 `static` (如 `memory_regions: static memory_region* = None`)一律**响亮失败** @@ -1155,6 +1204,10 @@ def _ExpandTypeDescriptors(Code: str) -> str: BeforePrevIdx: int = _PrevSignificantTokenIndex(Tokens, PrevIdx) if BeforePrevIdx >= 0 and Tokens[BeforePrevIdx].type == tokenize.NAME: InAnnotationPosition = True + elif Prev.string == '=' and _IsTypedefAnnotationRhs(Tokens, PrevIdx): + # `LPCSTR: t.CTypedef = const str`:typedef 的右值也是类型位置 + # (与 TPV 的 _parse_type_ann 右值分支同口径)。 + InAnnotationPosition = True if InAnnotationPosition: if Run[0].start[0] != Run[-1].end[0]: # 描述符串跨行:本层只支持同行(不增删换行的前提),响亮失败不静默丢 diff --git a/lib/core/TypeAnnotationResolver.py b/lib/core/TypeAnnotationResolver.py index 09a0ee2..0a8e227 100644 --- a/lib/core/TypeAnnotationResolver.py +++ b/lib/core/TypeAnnotationResolver.py @@ -149,15 +149,46 @@ class TypeAnnotationResolver: _TYPEDEF_SUGAR_RE: re.Pattern = re.compile( r'^typedef\s+([A-Za-z_]\w*)\s*=(?!=)\s*(.+?)\s*$') + @staticmethod + def _NormalizeTypedefRhsText(text: str) -> str: + """把 typedef 右值的 C 式写法归一成规范 `|` 联合文本(供**文本回退路径**使用)。 + + 磁盘原文里 `X: t.CTypedef = const str` / `= const uint16*` 的右值带描述符与指针 + 后缀,而本路径(_parse_typedef_line → _resolve_builtins_type_str)按表达式文本解析, + 故先归一: + - 前导 `const` / `volatile`(可组合) → `t.CConst` / `t.CVolatile` 前缀; + - 末尾 `*` / `**` 串 → 逐层 `| t.CPtr`。 + 不含上述形态的文本原样返回(幂等)。无算术语义风险:typedef 右值不含乘法。 + """ + s: str = text.strip() + if not s: + return text + markers: list[str] = [] + while True: + m: re.Match | None = re.match(r'^(const|volatile)\s+', s) + if m is None: + break + markers.append('t.CConst' if m.group(1) == 'const' else 't.CVolatile') + s = s[m.end():].lstrip() + ptrs: int = 0 + while s.endswith('*'): + s = s[:-1].rstrip() + ptrs += 1 + if not markers and ptrs == 0: + return text + parts: list[str] = markers + [s] + ['t.CPtr'] * ptrs + return ' | '.join(p for p in parts if p) + @staticmethod def _parse_typedef_line(stripped: str) -> tuple[str, str] | None: """单行源码文本 → typedef 声明 (名字, 类型值);非 typedef 行返回 None 兼容 `typedef 名字 = 类型`(语法糖)与 `名字: t.CTypedef = 类型`(注解)。 + 右值的 C 式写法(`const T` / `T*`)经 _NormalizeTypedefRhsText 归一为 `|` 联合。 """ m: re.Match | None = TypeAnnotationResolver._TYPEDEF_SUGAR_RE.match(stripped) if m is not None: - return m.group(1), m.group(2) + return m.group(1), TypeAnnotationResolver._NormalizeTypedefRhsText(m.group(2)) if ':' not in stripped or 't.CTypedef' not in stripped: return None name, _, rest = stripped.partition(':') @@ -167,7 +198,7 @@ class TypeAnnotationResolver: name = name.strip() if not name or not value: return None - return name, value + return name, TypeAnnotationResolver._NormalizeTypedefRhsText(value) @staticmethod def _builtins_include_dirs() -> list[str]: diff --git a/lib/vast/Parser.py b/lib/vast/Parser.py index 25ef138..be0533e 100644 --- a/lib/vast/Parser.py +++ b/lib/vast/Parser.py @@ -373,11 +373,34 @@ class Parser(ExprParserMixin): self._SetStoreContext(expr) return expr + @staticmethod + def _IsCTypedefAnnotation(annotation: N.expr | None) -> bool: + """注解是否为 typedef 标记(裸 `CTypedef` / `t.CTypedef` / 含它的 `|` 联合)。 + + 用于把 typedef 的右值按**类型位置**解析(`X: t.CTypedef = const uint16*` + 里的 `*` 后缀由 _ParseTypeAnnotation 消费,与注解位同一规则;描述符 + `const`/`volatile` 已由 SymbolUtils._ExpandTypeDescriptors 在文本层展开)。 + 仅按标记名判定,不依赖 import 别名表(与 TPV `_IsCTypedefAnnotation` 同口径)。 + """ + if annotation is None: + return False + if isinstance(annotation, N.Attribute): + return getattr(annotation, 'attr', None) == 'CTypedef' + if isinstance(annotation, N.Name): + return getattr(annotation, 'id', None) == 'CTypedef' + if isinstance(annotation, N.BinOp): + return (Parser._IsCTypedefAnnotation(getattr(annotation, 'left', None)) + or Parser._IsCTypedefAnnotation(getattr(annotation, 'right', None))) + return False + def _TryParseAnnAssign(self) -> N.AnnAssign | None: """尝试解析带注解赋值:x: T [= v] 或 x: T(目标为 Name/Attribute/Subscript)。 注意:仅当目标为简单 Name/Attribute/Subscript 且后随 ':' 时匹配; 元组/列表解包不做注解(返回 None 走普通路径)。 + + `t.CTypedef` 注解的右值是**类型**而非一般表达式(`const str` / `uint16*`), + 故走 `_ParseTypeAnnotation`(与注解位同一路径,支持 C 式指针后缀)。 """ start: Token = self._Peek() # 名称 @@ -388,7 +411,10 @@ class Parser(ExprParserMixin): value: N.expr | None = None if self._AtOp('='): self._Next() - value = self.ParseExpr() + if self._IsCTypedefAnnotation(annotation): + value = self._ParseTypeAnnotation() + else: + value = self.ParseExpr() target: N.Name = N.Name(id=name_tok.Value, ctx=N.Store()) self._FixLoc(target, name_tok) node: N.AnnAssign = N.AnnAssign(target=target, annotation=annotation, @@ -409,7 +435,10 @@ class Parser(ExprParserMixin): value = None if self._AtOp('='): self._Next() - value = self.ParseExpr() + if self._IsCTypedefAnnotation(annotation): + value = self._ParseTypeAnnotation() + else: + value = self.ParseExpr() self._SetStoreContext(expr) simple: int = 1 if isinstance(expr, N.Name) else 0 node = N.AnnAssign(target=expr, annotation=annotation, value=value, simple=simple) diff --git a/lib/vast_c/_parser.pyd b/lib/vast_c/_parser.pyd index 0ba5c95cadf2c8f79679266b0c6a53314536d26e..9e5184d2dce523e7522920cc96cec00a4b8636c4 100644 GIT binary patch delta 52457 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 G`~LthdPoWY diff --git a/lib/vast_c/vast_c.c b/lib/vast_c/vast_c.c index 7fa8716..46e47fb 100644 --- a/lib/vast_c/vast_c.c +++ b/lib/vast_c/vast_c.c @@ -4651,6 +4651,50 @@ static PyObject *ParseSimpleStmt(Parser *P) { return Node; } +/* 注解是否为 typedef 标记(裸 CTypedef / t.CTypedef / 含它的 `|` 联合)。 + * 用于把 typedef 的右值按类型位置解析(`X: t.CTypedef = const uint16*` 的 `*` 后缀 + * 由 ParseTypeAnnotation 消费),与 Python vast Parser._IsCTypedefAnnotation 同口径。 */ +static int IsCTypedefAnnotation(PyObject *Ann) { + if (Ann == NULL || Ann == Py_None) { + return 0; + } + if (NodeIs(Ann, "Name") || NodeIs(Ann, "Attribute")) { + const char *Field = NodeIs(Ann, "Name") ? "id" : "attr"; + PyObject *V = PyObject_GetAttrString(Ann, Field); + int Hit = 0; + if (V != NULL) { + if (PyUnicode_Check(V) && PyUnicode_CompareWithASCIIString(V, "CTypedef") == 0) { + Hit = 1; + } + Py_DECREF(V); + } else { + PyErr_Clear(); + } + return Hit; + } + if (NodeIs(Ann, "BinOp")) { + int Hit = 0; + PyObject *L = PyObject_GetAttrString(Ann, "left"); + if (L != NULL) { + Hit = IsCTypedefAnnotation(L); + Py_DECREF(L); + } else { + PyErr_Clear(); + } + if (!Hit) { + PyObject *R = PyObject_GetAttrString(Ann, "right"); + if (R != NULL) { + Hit = IsCTypedefAnnotation(R); + Py_DECREF(R); + } else { + PyErr_Clear(); + } + } + return Hit; + } + return 0; +} + /* 尝试解析带注解赋值(对齐 vast _TryParseAnnAssign) */ static PyObject *TryParseAnnAssign(Parser *P) { Token *Start = PeekTok(P, 0); @@ -4666,7 +4710,8 @@ static PyObject *TryParseAnnAssign(Parser *P) { PyObject *Value = NULL; if (AtOp(P, "=")) { NextTok(P); - Value = ParseExpr(P); + /* A typedef's RHS is a type (`const str` / `uint16*`), not a general expression. */ + Value = IsCTypedefAnnotation(Annotation) ? ParseTypeAnnotation(P) : ParseExpr(P); if (Value == NULL) { Py_DECREF(Annotation); return NULL; @@ -4712,7 +4757,8 @@ static PyObject *TryParseAnnAssign(Parser *P) { PyObject *Value = NULL; if (AtOp(P, "=")) { NextTok(P); - Value = ParseExpr(P); + /* A typedef's RHS is a type (`const str` / `uint16*`). */ + Value = IsCTypedefAnnotation(Annotation) ? ParseTypeAnnotation(P) : ParseExpr(P); if (Value == NULL) { Py_DECREF(Annotation); Py_DECREF(Expr);