import sys import os import tokenize import ast if sys.version_info < (3,): from StringIO import StringIO as FileLike else: from io import BytesIO as FileLike def tokenize_string(s): if sys.version_info < (3,): return tokenize.generate_tokens(FileLike(s).readline) else: return tokenize.tokenize(FileLike(s).readline) EXAMPLE = b""" def f(): for x in s: if y: z # Comment this_line_off_by_one """ def win_line_endings(s): if os.name == 'nt': return s return s.replace(b"\n", b"\r\n") def make_problem_string(): example = win_line_endings(EXAMPLE) return example.replace(b"Comment\r\n\r\n", b"Comment\r\r\n") problem = make_problem_string() for tkn in tokenize_string(problem): print((tkn[1], tkn[2])) m = ast.parse(problem, "", "exec") l = m.body[-1] print("") print(l.value.id, l.lineno)