diff --git a/lib/vast/ExprParser.py b/lib/vast/ExprParser.py index b78282c..7131d15 100644 --- a/lib/vast/ExprParser.py +++ b/lib/vast/ExprParser.py @@ -77,7 +77,18 @@ class TokenStream: return self.Tokens[max(0, self.Idx - 1)] def _At(self, tok_type: str, value: str | None = None) -> bool: - tok: Token = self._Peek() + # 内联 _Peek(0) 缓存逻辑(行为与 _Peek(offset=0) 完全一致): + # 命中缓存直接取 _PeekCacheTok,miss 时读 Tokens[i] 并更新缓存; + # i >= len(Tokens) 时取末尾哨兵 token(不更新缓存)。 + i: int = self.Idx + if i >= len(self.Tokens): + tok: Token = self.Tokens[-1] + elif self._PeekCacheIdx == i: + tok = self._PeekCacheTok + else: + self._PeekCacheIdx = i + self._PeekCacheTok = self.Tokens[i] + tok = self._PeekCacheTok if tok.Type != tok_type: return False if value is not None and tok.Value != value: diff --git a/lib/vast/Nodes.py b/lib/vast/Nodes.py index a8aa790..8d8c498 100644 --- a/lib/vast/Nodes.py +++ b/lib/vast/Nodes.py @@ -310,9 +310,9 @@ def _MakeNodeClass(name: str, fields: tuple[str, ...], attrs: tuple[str, ...]) - f'{name} constructor takes at most {len(fields)} positional arguments' ) for fname, val in zip(fields, args): - setattr(self, fname, val) + self.__dict__[fname] = val for k, v in kwargs.items(): - setattr(self, k, v) + self.__dict__[k] = v base_name: str | None = _BASE_CLASS.get(name) base_cls: type = globals()[base_name] if base_name else AST