home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 1.5)
-
- '''Utility to compile possibly incomplete Python source code.'''
- import sys
- import string
- import traceback
-
- def compile_command(source, filename = '<input>', symbol = 'single'):
- '''Compile a command and determine whether it is incomplete.
-
- Arguments:
-
- source -- the source string; may contain \\n characters
- filename -- optional filename from which source was read; default "<input>"
- symbol -- optional grammar start symbol; "single" (default) or "eval"
-
- Return value / exceptions raised:
-
- - Return a code object if the command is complete and valid
- - Return None if the command is incomplete
- - Raise SyntaxError or OverflowError if the command is a syntax error
- (OverflowError if the error is in a numeric constant)
-
- Approach:
-
- First, check if the source consists entirely of blank lines and
- comments; if so, replace it with \'pass\', because the built-in
- parser doesn\'t always do the right thing for these.
-
- Compile three times: as is, with \\n, and with \\n\\n appended. If
- it compiles as is, it\'s complete. If it compiles with one \\n
- appended, we expect more. If it doesn\'t compile either way, we
- compare the error we get when compiling with \\n or \\n\\n appended.
- If the errors are the same, the code is broken. But if the errors
- are different, we expect more. Not intuitive; not even guaranteed
- to hold in future releases; but this matches the compiler\'s
- behavior from Python 1.4 through 1.5.2, at least.
-
- Caveat:
-
- It is possible (but not likely) that the parser stops parsing
- with a successful outcome before reaching the end of the source;
- in this case, trailing symbols may be ignored instead of causing an
- error. For example, a backslash followed by two newlines may be
- followed by arbitrary garbage. This will be fixed once the API
- for the parser is better.
-
- '''
- for line in string.split(source, '\n'):
- line = string.strip(line)
- else:
- source = 'pass'
-
- try:
- code = compile(source, filename, symbol)
- except SyntaxError:
- err = err1 = err2 = err = err1 = err2 = None
- err = err1 = err2 = err = err1 = err2 = None
- except:
- code = code1 = code2 = None
-
-
- try:
- code1 = compile(source + '\n', filename, symbol)
- except SyntaxError:
- err = err1 = err2 = err = err1 = err2 = None
- err = err1 = err2 = err = err1 = err2 = None
- except:
- code = code1 = code2 = None
-
-
- try:
- code2 = compile(source + '\n\n', filename, symbol)
- except SyntaxError:
- err = err1 = err2 = err = err1 = err2 = None
- err = err1 = err2 = err = err1 = err2 = None
- except:
- code = code1 = code2 = None
-
-
- try:
- e1 = err1.__dict__
- except AttributeError:
- None if line and line[0] != '#' else string.split(source, '\n') if code else err = err1 = err2 = err = err1 = err2 = None
- None if line and line[0] != '#' else string.split(source, '\n') if code else err = err1 = err2 = err = err1 = err2 = None
- e1 = err1
- except:
- None if line and line[0] != '#' else string.split(source, '\n') if code else err = err1 = err2 = err = err1 = err2 = None
-
-
- try:
- e2 = err2.__dict__
- except AttributeError:
- None if line and line[0] != '#' else string.split(source, '\n') if code else err = err1 = err2 = err = err1 = err2 = None
- None if line and line[0] != '#' else string.split(source, '\n') if code else err = err1 = err2 = err = err1 = err2 = None
- e2 = err2
- except:
- None if line and line[0] != '#' else string.split(source, '\n') if code else err = err1 = err2 = err = err1 = err2 = None
-
- if not code1 and e1 == e2:
- raise SyntaxError, err1
-
-
-