mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-27 18:51:41 +02:00
Improve typing info for lex_scanner
This commit is contained in:
@@ -6,6 +6,8 @@ from functools import lru_cache
|
|||||||
from gettext import gettext as _
|
from gettext import gettext as _
|
||||||
from typing import Callable, Iterator, List, NamedTuple, Optional, Sequence, Set, Tuple, TypeVar, Union
|
from typing import Callable, Iterator, List, NamedTuple, Optional, Sequence, Set, Tuple, TypeVar, Union
|
||||||
|
|
||||||
|
from .types import run_once
|
||||||
|
|
||||||
|
|
||||||
class ParseException(Exception):
|
class ParseException(Exception):
|
||||||
|
|
||||||
@@ -115,13 +117,15 @@ class Token(NamedTuple):
|
|||||||
val: str
|
val: str
|
||||||
|
|
||||||
|
|
||||||
lex_scanner = getattr(re, 'Scanner')([
|
@run_once
|
||||||
(r'[()]', lambda x, t: Token(TokenType.OPCODE, t)),
|
def lex_scanner() -> Callable[[str], Tuple[List[Token], str]]:
|
||||||
(r'@.+?:[^")\s]+', lambda x, t: Token(TokenType.WORD, str(t))),
|
return getattr(re, 'Scanner')([ # type: ignore
|
||||||
(r'[^"()\s]+', lambda x, t: Token(TokenType.WORD, str(t))),
|
(r'[()]', lambda x, t: Token(TokenType.OPCODE, t)),
|
||||||
(r'".*?((?<!\\)")', lambda x, t: Token(TokenType.QUOTED_WORD, t[1:-1])),
|
(r'@.+?:[^")\s]+', lambda x, t: Token(TokenType.WORD, str(t))),
|
||||||
(r'\s+', None)
|
(r'[^"()\s]+', lambda x, t: Token(TokenType.WORD, str(t))),
|
||||||
], flags=re.DOTALL)
|
(r'".*?((?<!\\)")', lambda x, t: Token(TokenType.QUOTED_WORD, t[1:-1])),
|
||||||
|
(r'\s+', None)
|
||||||
|
], flags=re.DOTALL).scan
|
||||||
REPLACEMENTS = tuple(('\\' + x, chr(i + 1)) for i, x in enumerate('\\"()'))
|
REPLACEMENTS = tuple(('\\' + x, chr(i + 1)) for i, x in enumerate('\\"()'))
|
||||||
|
|
||||||
|
|
||||||
@@ -174,7 +178,7 @@ class Parser:
|
|||||||
# lex scanner doesn't get confused. We put them back later.
|
# lex scanner doesn't get confused. We put them back later.
|
||||||
for k, v in REPLACEMENTS:
|
for k, v in REPLACEMENTS:
|
||||||
expr = expr.replace(k, v)
|
expr = expr.replace(k, v)
|
||||||
tokens = lex_scanner.scan(expr)[0]
|
tokens = lex_scanner()(expr)[0]
|
||||||
|
|
||||||
def unescape(x: str) -> str:
|
def unescape(x: str) -> str:
|
||||||
for k, v in REPLACEMENTS:
|
for k, v in REPLACEMENTS:
|
||||||
|
|||||||
Reference in New Issue
Block a user