diff options
author | Guido van Rossum <guido@python.org> | 1992-01-01 19:22:25 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1992-01-01 19:22:25 (GMT) |
commit | 318a91c3f2b33b79999965c52fb412ff0c971bef (patch) | |
tree | 6d03e69bc63b74f642f073f57c2d41e6d9bc59e8 /Demo/scripts/eqfix.py | |
parent | 0a60ee1c69e248281195d8cf653423825a35aae3 (diff) | |
download | cpython-318a91c3f2b33b79999965c52fb412ff0c971bef.zip cpython-318a91c3f2b33b79999965c52fb412ff0c971bef.tar.gz cpython-318a91c3f2b33b79999965c52fb412ff0c971bef.tar.bz2 |
Tokenizing version (see lib/tokenize.py).
Diffstat (limited to 'Demo/scripts/eqfix.py')
-rwxr-xr-x | Demo/scripts/eqfix.py | 59 |
1 files changed, 37 insertions, 22 deletions
diff --git a/Demo/scripts/eqfix.py b/Demo/scripts/eqfix.py index c666ee0..3322b7af 100755 --- a/Demo/scripts/eqfix.py +++ b/Demo/scripts/eqfix.py @@ -1,11 +1,12 @@ #! /ufs/guido/bin/sgi/python #! /usr/local/python -# Fix Python source files to use the new equality test operator, -# i.e., -# if x == y: ... -# instead of +# Fix Python source files to use the new equality test operator, i.e., # if x = y: ... +# is changed to +# if x == y: ... +# The script correctly tokenizes the Python program to reliably +# distinguish between assignments and equality tests. # # Command line arguments are files or directories to be processed. # Directories are searched recursively for files whose name looks @@ -77,7 +78,7 @@ def recursedown(dirname): return bad def fix(filename): - dbg('fix(' + `filename` + ')\n') +## dbg('fix(' + `filename` + ')\n') try: f = open(filename, 'r') except IOError, msg: @@ -144,25 +145,39 @@ def fix(filename): # Return succes return 0 -PAT1 = '\<\(if\|elif\|while\)\>[\0-\377]*[^<>!=]\(=\)[^=][\0-\377]*[^[]:[^]]' -# \2 \3 -PAT2 = '\<return\>[\0-\377]*[^<>!=]\(=\)[^=]' -# \4 -PAT = '^[ \t]*\(' + PAT1 + '\|' + PAT2 + '\)' -# \1 -prog = regex.compile(PAT) + +from tokenize import tokenprog + +match = {'if':':', 'elif':':', 'while':':', 'return':'\n', \ + '(':')', '[':']', '{':'}', '`':'`'} def fixline(line): - while prog.match(line) >= 0: - regs = prog.regs - if regs[3] == (-1, -1): - a, b = regs[4] - else: - a, b = regs[3] - if not 0 < a < b < len(line): - dbg('Weird: ' + line) - break - line = line[:a] + '==' + line[b:] + # Quick check for easy case + if '=' not in line: return line + + i, n = 0, len(line) + stack = [] + while i < n: + j = tokenprog.match(line, i) + if j < 0: + # A bad token; forget about the rest of this line + print '(Syntax error:)' + print line, + return line + a, b = tokenprog.regs[3] # Location of the token proper + token = line[a:b] + i = i+j + if stack and token == stack[-1]: + del stack[-1] + elif match.has_key(token): + stack.append(match[token]) + elif token == '=' and stack: + line = line[:a] + '==' + line[b:] + i, n = a + len('=='), len(line) + elif token == '==' and not stack: + print '(Warning: \'==\' at top level:)' + print line, return line + main() |