예제 #1
0
파일: factory.py 프로젝트: msander/lepl
 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))
예제 #2
0
파일: iter.py 프로젝트: gcarothers/lepl
 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_})
예제 #3
0
 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_})
예제 #4
0
파일: simple.py 프로젝트: gcarothers/lepl
 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_})
예제 #5
0
파일: factory.py 프로젝트: msander/lepl
 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)
예제 #6
0
 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_})
예제 #7
0
 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)
예제 #8
0
파일: simple.py 프로젝트: gcarothers/lepl
 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)
예제 #9
0
 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
예제 #10
0
파일: simple.py 프로젝트: gcarothers/lepl
 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
예제 #11
0
파일: factory.py 프로젝트: msander/lepl
 def from_sequence(self, sequence, **kargs):
     '''
     Return a generic stream for any indexable sequence.
     '''
     add_defaults(kargs, {'factory': self})
     return (0, SequenceHelper(sequence, **kargs))
예제 #12
0
파일: factory.py 프로젝트: msander/lepl
 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))
예제 #13
0
파일: factory.py 프로젝트: msander/lepl
 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))