MCPcopy
hub / github.com/pytest-dev/pytest / lex

Method lex

src/_pytest/mark/expression.py:80–130  ·  view source on GitHub ↗
(self, input: str)

Source from the content-addressed store, hash-verified

78 self.current = next(self.tokens)
79
80 def lex(self, input: str) -> Iterator[Token]:
81 pos = 0
82 while pos < len(input):
83 if input[pos] in (" ", "\t"):
84 pos += 1
85 elif input[pos] == "(":
86 yield Token(TokenType.LPAREN, "(", pos)
87 pos += 1
88 elif input[pos] == ")":
89 yield Token(TokenType.RPAREN, ")", pos)
90 pos += 1
91 elif input[pos] == "=":
92 yield Token(TokenType.EQUAL, "=", pos)
93 pos += 1
94 elif input[pos] == ",":
95 yield Token(TokenType.COMMA, ",", pos)
96 pos += 1
97 elif (quote_char := input[pos]) in ("'", '"'):
98 end_quote_pos = input.find(quote_char, pos + 1)
99 if end_quote_pos == -1:
100 raise SyntaxError(
101 f'closing quote "{quote_char}" is missing',
102 (FILE_NAME, 1, pos + 1, input),
103 )
104 value = input[pos : end_quote_pos + 1]
105 if (backslash_pos := value.find("\\")) != -1:
106 raise SyntaxError(
107 r'escaping with "\" not supported in marker expression',
108 (FILE_NAME, 1, pos + backslash_pos + 1, input),
109 )
110 yield Token(TokenType.STRING, value, pos)
111 pos += len(value)
112 else:
113 match = re.match(r"(:?\w|:|\+|-|\.|\[|\]|\\|/)+", input[pos:])
114 if match:
115 value = match.group(0)
116 if value == "or":
117 yield Token(TokenType.OR, value, pos)
118 elif value == "and":
119 yield Token(TokenType.AND, value, pos)
120 elif value == "not":
121 yield Token(TokenType.NOT, value, pos)
122 else:
123 yield Token(TokenType.IDENT, value, pos)
124 pos += len(value)
125 else:
126 raise SyntaxError(
127 f'unexpected character "{input[pos]}"',
128 (FILE_NAME, 1, pos + 1, input),
129 )
130 yield Token(TokenType.EOF, "", pos)
131
132 @overload
133 def accept(self, type: TokenType, *, reject: Literal[True]) -> Token: ...

Callers 1

__init__Method · 0.95

Calls 3

TokenClass · 0.85
matchMethod · 0.80
groupMethod · 0.80

Tested by

no test coverage detected