Lines Matching refs:pos
75 pos = 0
84 pos = skip_chars(src, pos, TOML_WS)
95 char = src[pos]
99 pos += 1
102 pos = key_value_rule(src, pos, out, header, parse_float)
103 pos = skip_chars(src, pos, TOML_WS)
106 second_char: str | None = src[pos + 1]
111 pos, header = create_list_rule(src, pos, out)
113 pos, header = create_dict_rule(src, pos, out)
114 pos = skip_chars(src, pos, TOML_WS)
116 raise suffixed_err(src, pos, "Invalid statement")
119 pos = skip_comment(src, pos)
123 char = src[pos]
128 src, pos, "Expected newline or end of document after a statement"
130 pos += 1
232 def skip_chars(src: str, pos: Pos, chars: Iterable[str]) -> Pos:
234 while src[pos] in chars:
235 pos += 1
238 return pos
243 pos: Pos,
250 new_pos = src.index(expect, pos)
256 if not error_on.isdisjoint(src[pos:new_pos]):
257 while src[pos] not in error_on:
258 pos += 1
259 raise suffixed_err(src, pos, f"Found invalid character {src[pos]!r}")
263 def skip_comment(src: str, pos: Pos) -> Pos:
265 char: str | None = src[pos]
270 src, pos + 1, "\n", error_on=ILLEGAL_COMMENT_CHARS, error_on_eof=False
272 return pos
275 def skip_comments_and_array_ws(src: str, pos: Pos) -> Pos:
277 pos_before_skip = pos
278 pos = skip_chars(src, pos, TOML_WS_AND_NEWLINE)
279 pos = skip_comment(src, pos)
280 if pos == pos_before_skip:
281 return pos
284 def create_dict_rule(src: str, pos: Pos, out: Output) -> tuple[Pos, Key]:
285 pos += 1 # Skip "["
286 pos = skip_chars(src, pos, TOML_WS)
287 pos, key = parse_key(src, pos)
290 raise suffixed_err(src, pos, f"Cannot declare {key} twice")
295 raise suffixed_err(src, pos, "Cannot overwrite a value") from None
297 if not src.startswith("]", pos):
298 raise suffixed_err(src, pos, "Expected ']' at the end of a table declaration")
299 return pos + 1, key
302 def create_list_rule(src: str, pos: Pos, out: Output) -> tuple[Pos, Key]:
303 pos += 2 # Skip "[["
304 pos = skip_chars(src, pos, TOML_WS)
305 pos, key = parse_key(src, pos)
308 raise suffixed_err(src, pos, f"Cannot mutate immutable namespace {key}")
316 raise suffixed_err(src, pos, "Cannot overwrite a value") from None
318 if not src.startswith("]]", pos):
319 raise suffixed_err(src, pos, "Expected ']]' at the end of an array declaration")
320 return pos + 2, key
324 src: str, pos: Pos, out: Output, header: Key, parse_float: ParseFloat
326 pos, key, value = parse_key_value_pair(src, pos, parse_float)
334 raise suffixed_err(src, pos, f"Cannot redefine namespace {cont_key}")
341 src, pos, f"Cannot mutate immutable namespace {abs_key_parent}"
347 raise suffixed_err(src, pos, "Cannot overwrite a value") from None
349 raise suffixed_err(src, pos, "Cannot overwrite a value")
354 return pos
358 src: str, pos: Pos, parse_float: ParseFloat
360 pos, key = parse_key(src, pos)
362 char: str | None = src[pos]
366 raise suffixed_err(src, pos, "Expected '=' after a key in a key/value pair")
367 pos += 1
368 pos = skip_chars(src, pos, TOML_WS)
369 pos, value = parse_value(src, pos, parse_float)
370 return pos, key, value
373 def parse_key(src: str, pos: Pos) -> tuple[Pos, Key]:
374 pos, key_part = parse_key_part(src, pos)
376 pos = skip_chars(src, pos, TOML_WS)
379 char: str | None = src[pos]
383 return pos, key
384 pos += 1
385 pos = skip_chars(src, pos, TOML_WS)
386 pos, key_part = parse_key_part(src, pos)
388 pos = skip_chars(src, pos, TOML_WS)
391 def parse_key_part(src: str, pos: Pos) -> tuple[Pos, str]:
393 char: str | None = src[pos]
397 start_pos = pos
398 pos = skip_chars(src, pos, BARE_KEY_CHARS)
399 return pos, src[start_pos:pos]
401 return parse_literal_str(src, pos)
403 return parse_one_line_basic_str(src, pos)
404 raise suffixed_err(src, pos, "Invalid initial character for a key part")
407 def parse_one_line_basic_str(src: str, pos: Pos) -> tuple[Pos, str]:
408 pos += 1
409 return parse_basic_str(src, pos, multiline=False)
412 def parse_array(src: str, pos: Pos, parse_float: ParseFloat) -> tuple[Pos, list]:
413 pos += 1
416 pos = skip_comments_and_array_ws(src, pos)
417 if src.startswith("]", pos):
418 return pos + 1, array
420 pos, val = parse_value(src, pos, parse_float)
422 pos = skip_comments_and_array_ws(src, pos)
424 c = src[pos : pos + 1]
426 return pos + 1, array
428 raise suffixed_err(src, pos, "Unclosed array")
429 pos += 1
431 pos = skip_comments_and_array_ws(src, pos)
432 if src.startswith("]", pos):
433 return pos + 1, array
436 def parse_inline_table(src: str, pos: Pos, parse_float: ParseFloat) -> tuple[Pos, dict]:
437 pos += 1
441 pos = skip_chars(src, pos, TOML_WS)
442 if src.startswith("}", pos):
443 return pos + 1, nested_dict.dict
445 pos, key, value = parse_key_value_pair(src, pos, parse_float)
448 raise suffixed_err(src, pos, f"Cannot mutate immutable namespace {key}")
452 raise suffixed_err(src, pos, "Cannot overwrite a value") from None
454 raise suffixed_err(src, pos, f"Duplicate inline table key {key_stem!r}")
456 pos = skip_chars(src, pos, TOML_WS)
457 c = src[pos : pos + 1]
459 return pos + 1, nested_dict.dict
461 raise suffixed_err(src, pos, "Unclosed inline table")
464 pos += 1
465 pos = skip_chars(src, pos, TOML_WS)
469 src: str, pos: Pos, *, multiline: bool = False
471 escape_id = src[pos : pos + 2]
472 pos += 2
477 pos = skip_chars(src, pos, TOML_WS)
479 char = src[pos]
481 return pos, ""
483 raise suffixed_err(src, pos, "Unescaped '\\' in a string")
484 pos += 1
485 pos = skip_chars(src, pos, TOML_WS_AND_NEWLINE)
486 return pos, ""
488 return parse_hex_char(src, pos, 4)
490 return parse_hex_char(src, pos, 8)
492 return pos, BASIC_STR_ESCAPE_REPLACEMENTS[escape_id]
494 raise suffixed_err(src, pos, "Unescaped '\\' in a string") from None
497 def parse_basic_str_escape_multiline(src: str, pos: Pos) -> tuple[Pos, str]:
498 return parse_basic_str_escape(src, pos, multiline=True)
501 def parse_hex_char(src: str, pos: Pos, hex_len: int) -> tuple[Pos, str]:
502 hex_str = src[pos : pos + hex_len]
504 raise suffixed_err(src, pos, "Invalid hex value")
505 pos += hex_len
508 raise suffixed_err(src, pos, "Escaped character is not a Unicode scalar value")
509 return pos, chr(hex_int)
512 def parse_literal_str(src: str, pos: Pos) -> tuple[Pos, str]:
513 pos += 1 # Skip starting apostrophe
514 start_pos = pos
515 pos = skip_until(
516 src, pos, "'", error_on=ILLEGAL_LITERAL_STR_CHARS, error_on_eof=True
518 return pos + 1, src[start_pos:pos] # Skip ending apostrophe
521 def parse_multiline_str(src: str, pos: Pos, *, literal: bool) -> tuple[Pos, str]:
522 pos += 3
523 if src.startswith("\n", pos):
524 pos += 1
530 pos,
535 result = src[pos:end_pos]
536 pos = end_pos + 3
539 pos, result = parse_basic_str(src, pos, multiline=True)
543 if not src.startswith(delim, pos):
544 return pos, result
545 pos += 1
546 if not src.startswith(delim, pos):
547 return pos, result + delim
548 pos += 1
549 return pos, result + (delim * 2)
552 def parse_basic_str(src: str, pos: Pos, *, multiline: bool) -> tuple[Pos, str]:
560 start_pos = pos
563 char = src[pos]
565 raise suffixed_err(src, pos, "Unterminated string") from None
568 return pos + 1, result + src[start_pos:pos]
569 if src.startswith('"""', pos):
570 return pos + 3, result + src[start_pos:pos]
571 pos += 1
574 result += src[start_pos:pos]
575 pos, parsed_escape = parse_escapes(src, pos)
577 start_pos = pos
580 raise suffixed_err(src, pos, f"Illegal character {char!r}")
581 pos += 1
585 src: str, pos: Pos, parse_float: ParseFloat
588 char: str | None = src[pos]
596 if src.startswith('"""', pos):
597 return parse_multiline_str(src, pos, literal=False)
598 return parse_one_line_basic_str(src, pos)
602 if src.startswith("'''", pos):
603 return parse_multiline_str(src, pos, literal=True)
604 return parse_literal_str(src, pos)
608 if src.startswith("true", pos):
609 return pos + 4, True
611 if src.startswith("false", pos):
612 return pos + 5, False
616 return parse_array(src, pos, parse_float)
620 return parse_inline_table(src, pos, parse_float)
623 datetime_match = RE_DATETIME.match(src, pos)
628 raise suffixed_err(src, pos, "Invalid date or datetime") from e
630 localtime_match = RE_LOCALTIME.match(src, pos)
637 number_match = RE_NUMBER.match(src, pos)
642 first_three = src[pos : pos + 3]
644 return pos + 3, parse_float(first_three)
645 first_four = src[pos : pos + 4]
647 return pos + 4, parse_float(first_four)
649 raise suffixed_err(src, pos, "Invalid value")
652 def suffixed_err(src: str, pos: Pos, msg: str) -> TOMLDecodeError:
656 def coord_repr(src: str, pos: Pos) -> str:
657 if pos >= len(src):
659 line = src.count("\n", 0, pos) + 1
661 column = pos + 1
663 column = pos - src.rindex("\n", 0, pos)
666 return TOMLDecodeError(f"{msg} (at {coord_repr(src, pos)})")