@@ -125,13 +125,15 @@ def _tokenise(seq: str) -> list[Token]:
125125 suffix_dot = 0
126126 if raw_token .startswith ("." ):
127127 suffix_dot = 1
128+ post_i = raw_token .rindex ("." , suffix_dot )
128129 suffix_i = raw_token .index ("." , suffix_dot )
129130 except ValueError :
131+ post_i = len (raw_token )
130132 suffix_i = len (raw_token )
131133
132134 token = Token (
133135 TokenType .STEM ,
134- raw_token [:suffix_i ],
136+ raw_token [:post_i ],
135137 column ,
136138 )
137139 tokens .append (token )
@@ -161,14 +163,7 @@ def _tokenise(seq: str) -> list[Token]:
161163 )
162164 tokens .append (token )
163165 elif i == len (raw_tokens ) - 1 :
164- if raw_token .startswith ("." ) and not raw_token .endswith ("." ):
165- token = Token (
166- TokenType .SUFFIXES ,
167- raw_token ,
168- column ,
169- )
170- tokens .append (token )
171- elif starts_with_range :
166+ if starts_with_range :
172167 if any (raw_token .startswith (sep ) for sep in _POST_RANGE_SEPARATORS ):
173168 token = Token (
174169 TokenType .POST_RANGE ,
@@ -180,19 +175,23 @@ def _tokenise(seq: str) -> list[Token]:
180175 column += 1
181176
182177 if raw_token .endswith ("." ):
178+ post_i = 0
183179 suffix_i = len (raw_token )
184180 elif raw_token .startswith ("." ):
181+ post_i = 0
185182 suffix_i = 0
186183 else :
187184 try :
185+ post_i = raw_token .rindex ("." )
188186 suffix_i = raw_token .index ("." )
189187 except ValueError :
188+ post_i = len (raw_token )
190189 suffix_i = len (raw_token )
191190
192- if raw_token [:suffix_i ]:
191+ if raw_token [:post_i ]:
193192 token = Token (
194193 TokenType .STEM ,
195- raw_token [:suffix_i ],
194+ raw_token [:post_i ],
196195 column ,
197196 )
198197 tokens .append (token )
@@ -204,10 +203,8 @@ def _tokenise(seq: str) -> list[Token]:
204203 column + suffix_i ,
205204 )
206205 tokens .append (token )
207- else :
208- if raw_token .endswith ("." ):
209- suffix_i = len (raw_token )
210- elif raw_token .startswith ("." ):
206+ elif not ends_with_range :
207+ if raw_token .startswith ("." ):
211208 suffix_i = 0
212209 else :
213210 try :
@@ -230,6 +227,55 @@ def _tokenise(seq: str) -> list[Token]:
230227 column + suffix_i ,
231228 )
232229 tokens .append (token )
230+ else :
231+ if any (raw_token .startswith (sep ) for sep in _PRE_RANGE_SEPARATORS ):
232+ token = Token (
233+ TokenType .PRE_RANGE ,
234+ raw_token [0 ],
235+ column ,
236+ )
237+ tokens .append (token )
238+ raw_token = raw_token [1 :]
239+ column += 1
240+
241+ prerange = None
242+ if any (raw_token .endswith (sep ) for sep in _PRE_RANGE_SEPARATORS ):
243+ prerange = Token (
244+ TokenType .PRE_RANGE ,
245+ raw_token [- 1 ],
246+ column + len (raw_token ) - 1 ,
247+ )
248+ raw_token = raw_token [:- 1 ]
249+
250+ if raw_token .startswith ("." ):
251+ stem_i = len (raw_token )
252+ suffix_i = 0
253+ else :
254+ try :
255+ stem_i = raw_token .rindex ("." )
256+ suffix_i = raw_token .index ("." )
257+ except ValueError :
258+ stem_i = 0
259+ suffix_i = len (raw_token )
260+
261+ token = Token (
262+ TokenType .STEM ,
263+ raw_token [:stem_i ],
264+ column ,
265+ )
266+ tokens .append (token )
267+
268+ if raw_token [suffix_i :]:
269+ token = Token (
270+ TokenType .SUFFIXES ,
271+ raw_token [suffix_i :],
272+ column + suffix_i ,
273+ )
274+ tokens .append (token )
275+
276+ if prerange :
277+ tokens .append (prerange )
278+ column += 1
233279
234280 column += len (raw_token )
235281
0 commit comments