Kaydet (Commit) f4b44fa6 authored tarafından Guido van Rossum's avatar Guido van Rossum

Tim's latest version (supports old and new tokenize modules)

üst 5d97ebf2
#! /home/guido/python/src/sparc/python
#! /usr/bin/env python #! /usr/bin/env python
"""The Tab Nanny despises ambiguous indentation. She knows no mercy. """The Tab Nanny despises ambiguous indentation. She knows no mercy."""
CAUTION: this version requires Guido's "NL" patch to lib/tokenize.py, # Released to the public domain, by Tim Peters, 4 April 1998.
posted 30-Mar-98. This version will not run at all with an unpatched
tokenize (it will raise AttributeError while loading), while previous
versions will run incorrectly with the patched tokenize.
"""
# Released to the public domain, by Tim Peters, 30 March 1998. __version__ = "3"
__version__ = "2"
import os import os
import sys import sys
import getopt import getopt
import tokenize import tokenize
try:
tokenize.NL
except AttributeError:
raise AttributeError, "Sorry, I need a version of tokenize.py " \
"that supports the NL pseudo-token."
verbose = 0 verbose = 0
def main(): def main():
...@@ -235,67 +222,131 @@ def format_witnesses(w): ...@@ -235,67 +222,131 @@ def format_witnesses(w):
prefix = prefix + "s" prefix = prefix + "s"
return prefix + " " + string.join(firsts, ', ') return prefix + " " + string.join(firsts, ', ')
indents = [] # The collection of globals, the reset_globals() function, and the
check_equal = 0 # tokeneater() function, depend on which version of tokenize is
# in use.
def reset_globals():
global indents, check_equal if hasattr(tokenize, 'NL'):
check_equal = 0 # take advantage of Guido's patch!
indents = [Whitespace("")]
indents = []
def tokeneater(type, token, start, end, line, check_equal = 0
INDENT=tokenize.INDENT,
DEDENT=tokenize.DEDENT, def reset_globals():
NEWLINE=tokenize.NEWLINE, global indents, check_equal
COMMENT=tokenize.COMMENT, check_equal = 0
NL=tokenize.NL): indents = [Whitespace("")]
global indents, check_equal
def tokeneater(type, token, start, end, line,
# test in decreasing order of frequency, although the check_equal INDENT=tokenize.INDENT,
# test *must* be last; INDENT and DEDENT appear equally often DEDENT=tokenize.DEDENT,
NEWLINE=tokenize.NEWLINE,
if type in (COMMENT, NL): COMMENT=tokenize.COMMENT,
# the indentation of these guys is meaningless NL=tokenize.NL):
pass global indents, check_equal
elif type == NEWLINE: # test in decreasing order of frequency, although the check_equal
# a program statement, or ENDMARKER, will eventually follow, # test *must* be last; INDENT and DEDENT appear equally often
# after some (possibly empty) run of tokens of the form
# (NL | COMMENT)* (INDENT | DEDENT+)? if type in (COMMENT, NL):
# If an INDENT appears, setting check_equal is wrong, and will # the indentation of these guys is meaningless
# be undone when we see the INDENT. pass
check_equal = 1
elif type == NEWLINE:
elif type == INDENT: # a program statement, or ENDMARKER, will eventually follow,
check_equal = 0 # after some (possibly empty) run of tokens of the form
thisguy = Whitespace(token) # (NL | COMMENT)* (INDENT | DEDENT+)?
if not indents[-1].less(thisguy): # If an INDENT appears, setting check_equal is wrong, and will
witness = indents[-1].not_less_witness(thisguy) # be undone when we see the INDENT.
msg = "indent not greater e.g. " + format_witnesses(witness) check_equal = 1
raise NannyNag(start[0], msg, line)
indents.append(thisguy) elif type == INDENT:
check_equal = 0
elif type == DEDENT: thisguy = Whitespace(token)
# there's nothing we need to check here! what's important is if not indents[-1].less(thisguy):
# that when the run of DEDENTs ends, the indentation of the witness = indents[-1].not_less_witness(thisguy)
# program statement (or ENDMARKER) that triggered the run is msg = "indent not greater e.g. " + format_witnesses(witness)
# equal to what's left at the top of the indents stack raise NannyNag(start[0], msg, line)
assert check_equal # else no earlier NEWLINE, or an earlier INDENT indents.append(thisguy)
del indents[-1]
elif type == DEDENT:
elif check_equal: # there's nothing we need to check here! what's important is
# this is the first "real token" following a NEWLINE, so it # that when the run of DEDENTs ends, the indentation of the
# must be the first token of the next program statment, or an # program statement (or ENDMARKER) that triggered the run is
# ENDMARKER; the "line" argument exposes the leading whitespace # equal to what's left at the top of the indents stack
# for this statement; in the case of ENDMARKER, line is an empty assert check_equal # else no earlier NEWLINE, or an earlier INDENT
# string, so will properly match the empty string with which the del indents[-1]
# "indents" stack was seeded
check_equal = 0 elif check_equal:
thisguy = Whitespace(line) # this is the first "real token" following a NEWLINE, so it
if not indents[-1].equal(thisguy): # must be the first token of the next program statement, or an
witness = indents[-1].not_equal_witness(thisguy) # ENDMARKER; the "line" argument exposes the leading whitespace
msg = "indent not equal e.g. " + format_witnesses(witness) # for this statement; in the case of ENDMARKER, line is an empty
raise NannyNag(start[0], msg, line) # string, so will properly match the empty string with which the
# "indents" stack was seeded
check_equal = 0
thisguy = Whitespace(line)
if not indents[-1].equal(thisguy):
witness = indents[-1].not_equal_witness(thisguy)
msg = "indent not equal e.g. " + format_witnesses(witness)
raise NannyNag(start[0], msg, line)
else:
# unpatched version of tokenize
nesting_level = 0
indents = []
check_equal = 0
def reset_globals():
global nesting_level, indents, check_equal
nesting_level = check_equal = 0
indents = [Whitespace("")]
def tokeneater(type, token, start, end, line,
INDENT=tokenize.INDENT,
DEDENT=tokenize.DEDENT,
NEWLINE=tokenize.NEWLINE,
COMMENT=tokenize.COMMENT,
OP=tokenize.OP):
global nesting_level, indents, check_equal
if type == INDENT:
check_equal = 0
thisguy = Whitespace(token)
if not indents[-1].less(thisguy):
witness = indents[-1].not_less_witness(thisguy)
msg = "indent not greater e.g. " + format_witnesses(witness)
raise NannyNag(start[0], msg, line)
indents.append(thisguy)
elif type == DEDENT:
del indents[-1]
elif type == NEWLINE:
if nesting_level == 0:
check_equal = 1
elif type == COMMENT:
pass
elif check_equal:
check_equal = 0
thisguy = Whitespace(line)
if not indents[-1].equal(thisguy):
witness = indents[-1].not_equal_witness(thisguy)
msg = "indent not equal e.g. " + format_witnesses(witness)
raise NannyNag(start[0], msg, line)
if type == OP and token in ('{', '[', '('):
nesting_level = nesting_level + 1
elif type == OP and token in ('}', ']', ')'):
if nesting_level == 0:
raise NannyNag(start[0],
"unbalanced bracket '" + token + "'",
line)
nesting_level = nesting_level - 1
if __name__ == '__main__': if __name__ == '__main__':
main() main()
......
#! /home/guido/python/src/sparc/python
#! /usr/bin/env python #! /usr/bin/env python
"""The Tab Nanny despises ambiguous indentation. She knows no mercy. """The Tab Nanny despises ambiguous indentation. She knows no mercy."""
CAUTION: this version requires Guido's "NL" patch to lib/tokenize.py, # Released to the public domain, by Tim Peters, 4 April 1998.
posted 30-Mar-98. This version will not run at all with an unpatched
tokenize (it will raise AttributeError while loading), while previous
versions will run incorrectly with the patched tokenize.
"""
# Released to the public domain, by Tim Peters, 30 March 1998. __version__ = "3"
__version__ = "2"
import os import os
import sys import sys
import getopt import getopt
import tokenize import tokenize
try:
tokenize.NL
except AttributeError:
raise AttributeError, "Sorry, I need a version of tokenize.py " \
"that supports the NL pseudo-token."
verbose = 0 verbose = 0
def main(): def main():
...@@ -235,67 +222,131 @@ def format_witnesses(w): ...@@ -235,67 +222,131 @@ def format_witnesses(w):
prefix = prefix + "s" prefix = prefix + "s"
return prefix + " " + string.join(firsts, ', ') return prefix + " " + string.join(firsts, ', ')
indents = [] # The collection of globals, the reset_globals() function, and the
check_equal = 0 # tokeneater() function, depend on which version of tokenize is
# in use.
def reset_globals():
global indents, check_equal if hasattr(tokenize, 'NL'):
check_equal = 0 # take advantage of Guido's patch!
indents = [Whitespace("")]
indents = []
def tokeneater(type, token, start, end, line, check_equal = 0
INDENT=tokenize.INDENT,
DEDENT=tokenize.DEDENT, def reset_globals():
NEWLINE=tokenize.NEWLINE, global indents, check_equal
COMMENT=tokenize.COMMENT, check_equal = 0
NL=tokenize.NL): indents = [Whitespace("")]
global indents, check_equal
def tokeneater(type, token, start, end, line,
# test in decreasing order of frequency, although the check_equal INDENT=tokenize.INDENT,
# test *must* be last; INDENT and DEDENT appear equally often DEDENT=tokenize.DEDENT,
NEWLINE=tokenize.NEWLINE,
if type in (COMMENT, NL): COMMENT=tokenize.COMMENT,
# the indentation of these guys is meaningless NL=tokenize.NL):
pass global indents, check_equal
elif type == NEWLINE: # test in decreasing order of frequency, although the check_equal
# a program statement, or ENDMARKER, will eventually follow, # test *must* be last; INDENT and DEDENT appear equally often
# after some (possibly empty) run of tokens of the form
# (NL | COMMENT)* (INDENT | DEDENT+)? if type in (COMMENT, NL):
# If an INDENT appears, setting check_equal is wrong, and will # the indentation of these guys is meaningless
# be undone when we see the INDENT. pass
check_equal = 1
elif type == NEWLINE:
elif type == INDENT: # a program statement, or ENDMARKER, will eventually follow,
check_equal = 0 # after some (possibly empty) run of tokens of the form
thisguy = Whitespace(token) # (NL | COMMENT)* (INDENT | DEDENT+)?
if not indents[-1].less(thisguy): # If an INDENT appears, setting check_equal is wrong, and will
witness = indents[-1].not_less_witness(thisguy) # be undone when we see the INDENT.
msg = "indent not greater e.g. " + format_witnesses(witness) check_equal = 1
raise NannyNag(start[0], msg, line)
indents.append(thisguy) elif type == INDENT:
check_equal = 0
elif type == DEDENT: thisguy = Whitespace(token)
# there's nothing we need to check here! what's important is if not indents[-1].less(thisguy):
# that when the run of DEDENTs ends, the indentation of the witness = indents[-1].not_less_witness(thisguy)
# program statement (or ENDMARKER) that triggered the run is msg = "indent not greater e.g. " + format_witnesses(witness)
# equal to what's left at the top of the indents stack raise NannyNag(start[0], msg, line)
assert check_equal # else no earlier NEWLINE, or an earlier INDENT indents.append(thisguy)
del indents[-1]
elif type == DEDENT:
elif check_equal: # there's nothing we need to check here! what's important is
# this is the first "real token" following a NEWLINE, so it # that when the run of DEDENTs ends, the indentation of the
# must be the first token of the next program statment, or an # program statement (or ENDMARKER) that triggered the run is
# ENDMARKER; the "line" argument exposes the leading whitespace # equal to what's left at the top of the indents stack
# for this statement; in the case of ENDMARKER, line is an empty assert check_equal # else no earlier NEWLINE, or an earlier INDENT
# string, so will properly match the empty string with which the del indents[-1]
# "indents" stack was seeded
check_equal = 0 elif check_equal:
thisguy = Whitespace(line) # this is the first "real token" following a NEWLINE, so it
if not indents[-1].equal(thisguy): # must be the first token of the next program statement, or an
witness = indents[-1].not_equal_witness(thisguy) # ENDMARKER; the "line" argument exposes the leading whitespace
msg = "indent not equal e.g. " + format_witnesses(witness) # for this statement; in the case of ENDMARKER, line is an empty
raise NannyNag(start[0], msg, line) # string, so will properly match the empty string with which the
# "indents" stack was seeded
check_equal = 0
thisguy = Whitespace(line)
if not indents[-1].equal(thisguy):
witness = indents[-1].not_equal_witness(thisguy)
msg = "indent not equal e.g. " + format_witnesses(witness)
raise NannyNag(start[0], msg, line)
else:
# unpatched version of tokenize
nesting_level = 0
indents = []
check_equal = 0
def reset_globals():
global nesting_level, indents, check_equal
nesting_level = check_equal = 0
indents = [Whitespace("")]
def tokeneater(type, token, start, end, line,
INDENT=tokenize.INDENT,
DEDENT=tokenize.DEDENT,
NEWLINE=tokenize.NEWLINE,
COMMENT=tokenize.COMMENT,
OP=tokenize.OP):
global nesting_level, indents, check_equal
if type == INDENT:
check_equal = 0
thisguy = Whitespace(token)
if not indents[-1].less(thisguy):
witness = indents[-1].not_less_witness(thisguy)
msg = "indent not greater e.g. " + format_witnesses(witness)
raise NannyNag(start[0], msg, line)
indents.append(thisguy)
elif type == DEDENT:
del indents[-1]
elif type == NEWLINE:
if nesting_level == 0:
check_equal = 1
elif type == COMMENT:
pass
elif check_equal:
check_equal = 0
thisguy = Whitespace(line)
if not indents[-1].equal(thisguy):
witness = indents[-1].not_equal_witness(thisguy)
msg = "indent not equal e.g. " + format_witnesses(witness)
raise NannyNag(start[0], msg, line)
if type == OP and token in ('{', '[', '('):
nesting_level = nesting_level + 1
elif type == OP and token in ('}', ']', ')'):
if nesting_level == 0:
raise NannyNag(start[0],
"unbalanced bracket '" + token + "'",
line)
nesting_level = nesting_level - 1
if __name__ == '__main__': if __name__ == '__main__':
main() main()
......
#! /home/guido/python/src/sparc/python
#! /usr/bin/env python #! /usr/bin/env python
"""The Tab Nanny despises ambiguous indentation. She knows no mercy. """The Tab Nanny despises ambiguous indentation. She knows no mercy."""
CAUTION: this version requires Guido's "NL" patch to lib/tokenize.py, # Released to the public domain, by Tim Peters, 4 April 1998.
posted 30-Mar-98. This version will not run at all with an unpatched
tokenize (it will raise AttributeError while loading), while previous
versions will run incorrectly with the patched tokenize.
"""
# Released to the public domain, by Tim Peters, 30 March 1998. __version__ = "3"
__version__ = "2"
import os import os
import sys import sys
import getopt import getopt
import tokenize import tokenize
try:
tokenize.NL
except AttributeError:
raise AttributeError, "Sorry, I need a version of tokenize.py " \
"that supports the NL pseudo-token."
verbose = 0 verbose = 0
def main(): def main():
...@@ -235,67 +222,131 @@ def format_witnesses(w): ...@@ -235,67 +222,131 @@ def format_witnesses(w):
prefix = prefix + "s" prefix = prefix + "s"
return prefix + " " + string.join(firsts, ', ') return prefix + " " + string.join(firsts, ', ')
indents = [] # The collection of globals, the reset_globals() function, and the
check_equal = 0 # tokeneater() function, depend on which version of tokenize is
# in use.
def reset_globals():
global indents, check_equal if hasattr(tokenize, 'NL'):
check_equal = 0 # take advantage of Guido's patch!
indents = [Whitespace("")]
indents = []
def tokeneater(type, token, start, end, line, check_equal = 0
INDENT=tokenize.INDENT,
DEDENT=tokenize.DEDENT, def reset_globals():
NEWLINE=tokenize.NEWLINE, global indents, check_equal
COMMENT=tokenize.COMMENT, check_equal = 0
NL=tokenize.NL): indents = [Whitespace("")]
global indents, check_equal
def tokeneater(type, token, start, end, line,
# test in decreasing order of frequency, although the check_equal INDENT=tokenize.INDENT,
# test *must* be last; INDENT and DEDENT appear equally often DEDENT=tokenize.DEDENT,
NEWLINE=tokenize.NEWLINE,
if type in (COMMENT, NL): COMMENT=tokenize.COMMENT,
# the indentation of these guys is meaningless NL=tokenize.NL):
pass global indents, check_equal
elif type == NEWLINE: # test in decreasing order of frequency, although the check_equal
# a program statement, or ENDMARKER, will eventually follow, # test *must* be last; INDENT and DEDENT appear equally often
# after some (possibly empty) run of tokens of the form
# (NL | COMMENT)* (INDENT | DEDENT+)? if type in (COMMENT, NL):
# If an INDENT appears, setting check_equal is wrong, and will # the indentation of these guys is meaningless
# be undone when we see the INDENT. pass
check_equal = 1
elif type == NEWLINE:
elif type == INDENT: # a program statement, or ENDMARKER, will eventually follow,
check_equal = 0 # after some (possibly empty) run of tokens of the form
thisguy = Whitespace(token) # (NL | COMMENT)* (INDENT | DEDENT+)?
if not indents[-1].less(thisguy): # If an INDENT appears, setting check_equal is wrong, and will
witness = indents[-1].not_less_witness(thisguy) # be undone when we see the INDENT.
msg = "indent not greater e.g. " + format_witnesses(witness) check_equal = 1
raise NannyNag(start[0], msg, line)
indents.append(thisguy) elif type == INDENT:
check_equal = 0
elif type == DEDENT: thisguy = Whitespace(token)
# there's nothing we need to check here! what's important is if not indents[-1].less(thisguy):
# that when the run of DEDENTs ends, the indentation of the witness = indents[-1].not_less_witness(thisguy)
# program statement (or ENDMARKER) that triggered the run is msg = "indent not greater e.g. " + format_witnesses(witness)
# equal to what's left at the top of the indents stack raise NannyNag(start[0], msg, line)
assert check_equal # else no earlier NEWLINE, or an earlier INDENT indents.append(thisguy)
del indents[-1]
elif type == DEDENT:
elif check_equal: # there's nothing we need to check here! what's important is
# this is the first "real token" following a NEWLINE, so it # that when the run of DEDENTs ends, the indentation of the
# must be the first token of the next program statment, or an # program statement (or ENDMARKER) that triggered the run is
# ENDMARKER; the "line" argument exposes the leading whitespace # equal to what's left at the top of the indents stack
# for this statement; in the case of ENDMARKER, line is an empty assert check_equal # else no earlier NEWLINE, or an earlier INDENT
# string, so will properly match the empty string with which the del indents[-1]
# "indents" stack was seeded
check_equal = 0 elif check_equal:
thisguy = Whitespace(line) # this is the first "real token" following a NEWLINE, so it
if not indents[-1].equal(thisguy): # must be the first token of the next program statement, or an
witness = indents[-1].not_equal_witness(thisguy) # ENDMARKER; the "line" argument exposes the leading whitespace
msg = "indent not equal e.g. " + format_witnesses(witness) # for this statement; in the case of ENDMARKER, line is an empty
raise NannyNag(start[0], msg, line) # string, so will properly match the empty string with which the
# "indents" stack was seeded
check_equal = 0
thisguy = Whitespace(line)
if not indents[-1].equal(thisguy):
witness = indents[-1].not_equal_witness(thisguy)
msg = "indent not equal e.g. " + format_witnesses(witness)
raise NannyNag(start[0], msg, line)
else:
# unpatched version of tokenize
nesting_level = 0
indents = []
check_equal = 0
def reset_globals():
global nesting_level, indents, check_equal
nesting_level = check_equal = 0
indents = [Whitespace("")]
def tokeneater(type, token, start, end, line,
INDENT=tokenize.INDENT,
DEDENT=tokenize.DEDENT,
NEWLINE=tokenize.NEWLINE,
COMMENT=tokenize.COMMENT,
OP=tokenize.OP):
global nesting_level, indents, check_equal
if type == INDENT:
check_equal = 0
thisguy = Whitespace(token)
if not indents[-1].less(thisguy):
witness = indents[-1].not_less_witness(thisguy)
msg = "indent not greater e.g. " + format_witnesses(witness)
raise NannyNag(start[0], msg, line)
indents.append(thisguy)
elif type == DEDENT:
del indents[-1]
elif type == NEWLINE:
if nesting_level == 0:
check_equal = 1
elif type == COMMENT:
pass
elif check_equal:
check_equal = 0
thisguy = Whitespace(line)
if not indents[-1].equal(thisguy):
witness = indents[-1].not_equal_witness(thisguy)
msg = "indent not equal e.g. " + format_witnesses(witness)
raise NannyNag(start[0], msg, line)
if type == OP and token in ('{', '[', '('):
nesting_level = nesting_level + 1
elif type == OP and token in ('}', ']', ')'):
if nesting_level == 0:
raise NannyNag(start[0],
"unbalanced bracket '" + token + "'",
line)
nesting_level = nesting_level - 1
if __name__ == '__main__': if __name__ == '__main__':
main() main()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment