diff --git a/lib/vast/ExprParser.py b/lib/vast/ExprParser.py index c55b0e7..b78282c 100644 --- a/lib/vast/ExprParser.py +++ b/lib/vast/ExprParser.py @@ -46,6 +46,11 @@ class TokenStream: self.Source: str = source self.LineStarts: list[int] = line_starts self.Idx: int = 0 + # _Peek(0) 缓存:递归下降解析常在同一游标位置重复窥视 + # (_At/_AtOp/_AtName 等),命中时跳过 len() 与列表索引。 + # 游标移动后 Idx 变化自然失配,无需显式失效。 + self._PeekCacheIdx: int = -1 + self._PeekCacheTok: Token | None = None # ------------------------------------------------------------------ # 游标操作 @@ -54,6 +59,12 @@ class TokenStream: i: int = self.Idx + offset if i >= len(self.Tokens): return self.Tokens[-1] + if offset == 0: + if self._PeekCacheIdx == i: + return self._PeekCacheTok + self._PeekCacheIdx = i + self._PeekCacheTok = self.Tokens[i] + return self._PeekCacheTok return self.Tokens[i] def _Next(self) -> Token: