annotate Lib/tokenize.py @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents b9fcfb99a3e5
children 31b0e5f0badf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
558
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # This module compiles a regular expression that recognizes Python tokens.
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 # It is designed to match the working of the Python tokenizer exactly.
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # It takes care of everything except indentation;
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # note that un-escaped newlines are tokens, too.
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # tokenprog.regs[3] gives the location of the token without whitespace
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # It also defines various subexpressions, but doesn't compile them.
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # See the function test() below for an example of how to use.
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 import regex
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # Note: to get a quoted backslash in a regexp, it must be quadrupled.
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 Ignore = '[ \t]*\(\\\\\n[ \t]*\)*\(#.*\)?'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 Name = '[a-zA-Z_][a-zA-Z0-9_]*'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 Hexnumber = '0[xX][0-9a-fA-F]*[lL]?'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 Octnumber = '0[0-7]*[lL]?'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 Decnumber = '[1-9][0-9]*[lL]?'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 Intnumber = Hexnumber + '\|' + Octnumber + '\|' + Decnumber
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 Exponent = '[eE][-+]?[0-9]+'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 Pointfloat = '\([0-9]+\.[0-9]*\|\.[0-9]+\)\(' + Exponent + '\)?'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 Expfloat = '[0-9]+' + Exponent
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 Floatnumber = Pointfloat + '\|' + Expfloat
705
1e8e3ab67b45 Change the order in which Floatnumber and Intnumber are tried
Guido van Rossum <guido@python.org>
parents: 558
diff changeset
25 Number = Floatnumber + '\|' + Intnumber
558
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26
1407
b9fcfb99a3e5 * test_select.py: (some) tests for built-in select module
Guido van Rossum <guido@python.org>
parents: 705
diff changeset
27 String = '\'\(\\\\.\|[^\\\n\']\)*\'' + '\|' + '"\(\\\\.\|[^\\\n"]\)*"'
b9fcfb99a3e5 * test_select.py: (some) tests for built-in select module
Guido van Rossum <guido@python.org>
parents: 705
diff changeset
28 # Note: this module *recognizes* double quotes, but for backward
b9fcfb99a3e5 * test_select.py: (some) tests for built-in select module
Guido van Rossum <guido@python.org>
parents: 705
diff changeset
29 # compatibility, it doesn't *use* them!
558
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 Operator = '~\|\+\|-\|\*\|/\|%\|\^\|&\||\|<<\|>>\|==\|<=\|<>\|!=\|>=\|=\|<\|>'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 Bracket = '[][(){}]'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 Special = '[:;.,`\n]'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 Funny = Operator + '\|' + Bracket + '\|' + Special
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 PlainToken = Name + '\|' + Number + '\|' + String + '\|' + Funny
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 Token = Ignore + '\(' + PlainToken + '\)'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 try:
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 save_syntax = regex.set_syntax(0) # Use default syntax
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 tokenprog = regex.compile(Token)
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 finally:
705
1e8e3ab67b45 Change the order in which Floatnumber and Intnumber are tried
Guido van Rossum <guido@python.org>
parents: 558
diff changeset
44 if save_syntax != 0:
1e8e3ab67b45 Change the order in which Floatnumber and Intnumber are tried
Guido van Rossum <guido@python.org>
parents: 558
diff changeset
45 dummy = regex.set_syntax(save_syntax) # Restore original syntax
558
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 def test(file):
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 f = open(file, 'r')
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 while 1:
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 line = f.readline()
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 if not line: break
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 i, n = 0, len(line)
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 while i < n:
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 j = tokenprog.match(line, i)
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 if j < 0:
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 print 'No token at', `line[i:i+20]` + '...'
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 i = i+1
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 else:
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 i = i+j
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 a, b = tokenprog.regs[3]
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 if a < b:
cfb53322c9d1 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 print 'Token:', `line[a:b]`