def _parse_string(source: Source, string_regex=BASIC_STRING, separator='"') -> str: source.expect(separator) res = [] while True: if not source.consume_regex(string_regex): raise DoesNotMatch('Invalid string starting from {text}' .format(text=source._text[:100])) res.append(source.last_consumed) # start of some escape character if not source.consume('\\'): break # do nothing if new line chars encountered # corresponds to \ if source.consume_regex(NEWLINE_ESCAPE_CHARS_REGEX): pass # read unicode characters elif source.consume_regex(SHORT_UNICODE_REGEX) or source.consume_regex(LONG_UNICODE_REGEX): res.append(chr(int(source.last_consumed, 16))) else: # fail if no escape character follows source.expect_regex(ESCAPE_CHARS_REGEX) res.append(ESCAPES_MAPPING[source.last_consumed]) source.expect(separator) return ''.join(res)
def parse_line_comment(source: Source) -> Comment: source.expect('#') source.consume_regex(COMMENT_REGEX) text = source.last_consumed source.expect_regex(re.compile(r'(?P<res>\n|\Z)')) return Comment(text)
def test_expect_string_regex_true(self): text = '"Hello"' s = Source(text) s.expect_regex(BASIC_STRING)