_E='original' _D='Binding' _C='string' _B='Original' _A=None import codecs,re from.compat import IS_TYPE_CHECKING,to_text if IS_TYPE_CHECKING:from typing import IO,Iterator,Match,NamedTuple,Optional,Pattern,Sequence,Text,Tuple def make_regex(string,extra_flags=0):return re.compile(to_text(string),re.UNICODE|extra_flags) _newline=make_regex('(\\r\\n|\\n|\\r)') _multiline_whitespace=make_regex('\\s*',extra_flags=re.MULTILINE) _whitespace=make_regex('[^\\S\\r\\n]*') _export=make_regex('(?:export[^\\S\\r\\n]+)?') _single_quoted_key=make_regex("'([^']+)'") _unquoted_key=make_regex('([^=\\#\\s]+)') _equal_sign=make_regex('(=[^\\S\\r\\n]*)') _single_quoted_value=make_regex("'((?:\\\\'|[^'])*)'") _double_quoted_value=make_regex('"((?:\\\\"|[^"])*)"') _unquoted_value_part=make_regex('([^ \\r\\n]*)') _comment=make_regex('(?:[^\\S\\r\\n]*#[^\\r\\n]*)?') _end_of_line=make_regex('[^\\S\\r\\n]*(?:\\r\\n|\\n|\\r|$)') _rest_of_line=make_regex('[^\\r\\n]*(?:\\r|\\n|\\r\\n)?') _double_quote_escapes=make_regex('\\\\[\\\\\'\\"abfnrtv]') _single_quote_escapes=make_regex("\\\\[\\\\']") try:import typing;Original=typing.NamedTuple(_B,[(_C,typing.Text),('line',int)]);Binding=typing.NamedTuple(_D,[('key',typing.Optional[typing.Text]),('value',typing.Optional[typing.Text]),(_E,Original),('error',bool)]) except ImportError:from collections import namedtuple;Original=namedtuple(_B,[_C,'line']);Binding=namedtuple(_D,['key','value',_E,'error']) class Position: def __init__(A,chars,line):A.chars=chars;A.line=line @classmethod def start(A):return A(chars=0,line=1) def set(A,other):B=other;A.chars=B.chars;A.line=B.line def advance(A,string):B=string;A.chars+=len(B);A.line+=len(re.findall(_newline,B)) class Error(Exception):0 class Reader: def __init__(A,stream):A.string=stream.read();A.position=Position.start();A.mark=Position.start() def has_next(A):return A.position.chars