diff --git a/ast/parser.vp b/ast/parser.vp index 3270ff8..74b1c44 100644 --- a/ast/parser.vp +++ b/ast/parser.vp @@ -1668,7 +1668,10 @@ def _parse_subscript(ps: rawptr[Parser], value: rawptr[AST]) -> rawptr[AST]: def _parse_slice(ps: rawptr[Parser]) -> rawptr[AST]: """Parse slice: [expr] ':' [expr] [':' [expr]] | expr | expr, expr, ...""" lower: rawptr[AST] = None - if not _match_op(ps, TokOp.Colon): + # 空下标(`T[]`,类型注解位置的无签名函数指针 t.Callable[]):`[` 后直接 `]` + # ⇒ slice 为 None(由类型解析侧按"空参数表"处理),不能调 _parse_expr, + # 否则报"意外的 token ']'"。 + if not _match_op(ps, TokOp.Colon) and not _match_op(ps, TokOp.Rsqb): lower = _parse_expr(ps) # Check if there’s a comma (tuple syntax: a[x, y, ...])