def from_iterable(self, iterable, **kargs): ''' Provide a stream for the contents of the iterable. This assumes that each value from the iterable is a "line" which will, in turn, be passed to the stream factory. ''' add_defaults(kargs, {'factory': self}) cons = Cons(iterable) return ((cons, self(cons.head, **kargs)), IterableHelper(**kargs))
def __init__(self, id=None, factory=None, max=None, global_kargs=None, cache_level=None, delta=None): super(BaseIterableHelper, self).__init__(id=id, factory=factory, max=max, global_kargs=global_kargs, cache_level=cache_level, delta=delta) add_defaults(self.global_kargs, { 'global_type': type_, 'filename': type_}) self._kargs = dict(self.global_kargs) add_defaults(self._kargs, {'type': type_})
def __init__(self, sequence, id=None, factory=None, max=None, global_kargs=None, cache_level=None, delta=None): super(SequenceHelper, self).__init__(id=id, factory=factory, max=max, global_kargs=global_kargs, cache_level=cache_level, delta=delta) self._sequence = sequence type_ = self._typename(sequence) add_defaults(self.global_kargs, { 'global_type': type_, 'filename': type_}) self._kargs = dict(self.global_kargs) add_defaults(self._kargs, {'type': type_})
def from_file(self, file_, **kargs): ''' Provide a stream for the contents of the file. There is no corresponding `from_path` because the opening and closing of the path must be done outside the parsing (or the contents will become unavailable), so use instead: with open(path) as f: parser.parse_file(f) which will close the file after parsing. ''' try: global_kargs = kargs.get('global_kargs', {}) add_defaults(global_kargs, {'filename': file_.name}) add_defaults(kargs, {'global_kargs': global_kargs}) except AttributeError: pass return self.from_iterable(file_, **kargs)
def __init__(self, id=None, factory=None, max=None, global_kargs=None, cache_level=None, delta=None): super(BaseIterableHelper, self).__init__(id=id, factory=factory, max=max, global_kargs=global_kargs, cache_level=cache_level, delta=delta) add_defaults(self.global_kargs, { 'global_type': type_, 'filename': type_ }) self._kargs = dict(self.global_kargs) add_defaults(self._kargs, {'type': type_})
def kargs(self, state, prefix='', kargs=None): if kargs is None: kargs = {} (_, lineno, char) = self.delta(state) start = self._sequence.rfind('\n', 0, state) + 1 # omit \n end = self._sequence.find('\n', state) # omit \n # all is str() because passed to SyntaxError constructor if end < 0: rest = repr(self._sequence[state:]) all = str(self._sequence[start:]) else: rest = repr(self._sequence[state:end]) all = str(self._sequence[start:end]) add_defaults(kargs, { 'type': '<string>', 'filename': '<string>', 'rest': rest, 'all': all, 'lineno': lineno, 'char': char}, prefix=prefix) return super(StringHelper, self).kargs(state, prefix=prefix, kargs=kargs)
def kargs(self, state, prefix='', kargs=None): if kargs is None: kargs = {} (_, line_no, char) = self.delta(state) start = self._sequence.rfind('\n', 0, state) + 1 # omit \n end = self._sequence.find('\n', state) # omit \n # all is str() because passed to SyntaxError constructor if end < 0: rest = repr(self._sequence[state:]) all = str(self._sequence[start:]) else: rest = repr(self._sequence[state:end]) all = str(self._sequence[start:end]) add_defaults(kargs, { 'type': '<string>', 'filename': '<string>', 'rest': rest, 'all': all, 'line_no': line_no, 'char': char}, prefix=prefix) return super(StringHelper, self).kargs(state, prefix=prefix, kargs=kargs)
def kargs(self, state, prefix='', kargs=None): ''' Generate a dictionary of values that describe the stream. These may be extended by subclasses. They are provided to `syntax_error_kargs`, for example. Note: Calculating this can be expensive; use only for error messages, not debug messages (that may be discarded). Implementation note: Because some values are ''' offset = state + self._delta[OFFSET] if kargs is None: kargs = {} add_defaults(kargs, self._kargs, prefix=prefix) within = offset > -1 and offset < len(self._sequence) data = self._fmt(self._sequence, state) text = self._fmt(self._sequence, state, index=False) # some values below may be already present in self._global_kargs defaults = {'data': data, 'global_data': data, 'text': text, 'global_text': text, 'offset': state, 'global_offset': offset, 'rest': self._fmt(self._sequence[offset:], 0, index=False), 'repr': repr(self._sequence[offset]) if within else '<EOS>', 'str': str(self._sequence[offset]) if within else '', 'lineno': 1, 'char': offset+1} add_defaults(kargs, defaults, prefix=prefix) add_defaults(kargs, {prefix + 'location': self._location(kargs, prefix)}) return kargs
def kargs(self, state, prefix='', kargs=None): ''' Generate a dictionary of values that describe the stream. These may be extended by subclasses. They are provided to `syntax_error_kargs`, for example. Note: Calculating this can be expensive; use only for error messages, not debug messages (that may be discarded). Implementation note: Because some values are ''' offset = state + self._delta[OFFSET] if kargs is None: kargs = {} add_defaults(kargs, self._kargs, prefix=prefix) within = -1 < offset < len(self._sequence) data = self._fmt(self._sequence, state) text = self._fmt(self._sequence, state, index=False) # some values below may be already present in self._global_kargs defaults = {'data': data, 'global_data': data, 'text': text, 'global_text': text, 'offset': state, 'global_offset': offset, 'rest': self._fmt(self._sequence[offset:], 0, index=False), 'repr': repr(self._sequence[offset]) if within else '<EOS>', 'str': str(self._sequence[offset]) if within else '', 'line_no': 1, 'char': offset+1} add_defaults(kargs, defaults, prefix=prefix) add_defaults(kargs, {prefix + 'location': self._location(kargs, prefix)}) return kargs
def from_sequence(self, sequence, **kargs): ''' Return a generic stream for any indexable sequence. ''' add_defaults(kargs, {'factory': self}) return (0, SequenceHelper(sequence, **kargs))
def from_list(self, list_, **kargs): ''' Provide a stream for the contents of the list. ''' add_defaults(kargs, {'factory': self}) return (0, ListHelper(list_, **kargs))
def from_string(self, text, **kargs): ''' Provide a stream for the contents of the string. ''' add_defaults(kargs, {'factory': self}) return (0, StringHelper(text, **kargs))