diff --git a/ast/parser.vp b/ast/parser.vp index 29c866c..8b36a03 100644 --- a/ast/parser.vp +++ b/ast/parser.vp @@ -1853,10 +1853,10 @@ def _parse_new_expr(ps: Parser*) -> AST*: src = NEW_SRC_MEMGR continue break - # 类型 + 可选实参:`T(args)` 复用普通表达式解析;`T`(无实参)是基本类型/别名的简写形式 - # (`new stack char`:标量没有构造序列,Gen 侧只需取存储 + 零初始化)。非类型原子(如 - # `new stack f * 2`)仍在此 fail-fast,不能让错误落到"class ... is not registered"那种远离根因的报文。 - callee: AST* = _parse_atom_expr(ps) + # 类型 + 可选实参:类型用**注解规则**解析 —— 这样前导数组声明符 `[N]T`、指针后缀 `T*`、 + # 泛型下标 `list[int]`、描述符前缀都与注解位置同口径;`T(args)` 的实参括号会被 `_parse_test` + # 自身吃成 Call,故这里按"是不是 Call"分流,行为与旧版一致。 + callee: AST* = _parse_type_ann(ps) if callee is None: _record_parse_err(ps) ps.error_count += 1