| 1 | #!/usr/bin/env python2
|
| 2 | from __future__ import print_function
|
| 3 | """
|
| 4 | generator_exception.py
|
| 5 | """
|
| 6 |
|
| 7 | import sys
|
| 8 |
|
| 9 |
|
| 10 | def Tokenize(s):
|
| 11 | for item in ('1', '2', '3'):
|
| 12 | yield item
|
| 13 |
|
| 14 |
|
| 15 | class TokenizeClass(object): # NOT a generator
|
| 16 | def __init__(self, s):
|
| 17 | self.s = s
|
| 18 | self.i = 1
|
| 19 |
|
| 20 | def next(self):
|
| 21 | if self.i == 4:
|
| 22 | raise StopIteration()
|
| 23 | ret = str(self.i)
|
| 24 | self.i += 1
|
| 25 | return ret
|
| 26 |
|
| 27 |
|
| 28 | class Parser(object):
|
| 29 | """Recursive TDOP parser."""
|
| 30 |
|
| 31 | def __init__(self, lexer):
|
| 32 | self.lexer = lexer # iterable
|
| 33 | self.token = None # current token
|
| 34 |
|
| 35 | def Next(self):
|
| 36 | """Move to the next token."""
|
| 37 | try:
|
| 38 | t = self.lexer.next()
|
| 39 | except StopIteration:
|
| 40 | t = None
|
| 41 | self.token = t
|
| 42 |
|
| 43 |
|
| 44 | def main(argv):
|
| 45 | if 1:
|
| 46 | lexer = Tokenize('1+2') # does NOT work
|
| 47 | else:
|
| 48 | lexer = TokenizeClass('1+2') # WORKS
|
| 49 |
|
| 50 | p = Parser(lexer)
|
| 51 | p.Next()
|
| 52 | print('Done')
|
| 53 |
|
| 54 |
|
| 55 | if __name__ == '__main__':
|
| 56 | try:
|
| 57 | main(sys.argv)
|
| 58 | except RuntimeError as e:
|
| 59 | print('FATAL: %s' % e, file=sys.stderr)
|
| 60 | sys.exit(1)
|