annotate Python/future.c @ 45155:86602b603462 2.5

backport of r60575 (issue #1750076): Debugger did not step on every iteration of a while statement. The mapping between bytecode offsets and source lines (lnotab) did not contain an entry for the beginning of the loop. Now it does, and the lnotab can be a bit larger: in particular, several statements on the same line generate several entries. However, this does not bother the settrace function, which will trigger only one 'line' event. The lnotab seems to be exactly the same as with python2.4.
author Amaury Forgeot d'Arc <amauryfa@gmail.com>
date Mon, 04 Feb 2008 22:34:57 +0000
parents 75a7106662a3
children f3c1f9c8ce9f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1 #include "Python.h"
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
2 #include "Python-ast.h"
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
3 #include "node.h"
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
4 #include "token.h"
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
5 #include "graminit.h"
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
6 #include "code.h"
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
7 #include "compile.h"
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
8 #include "symtable.h"
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10 #define UNDEFINED_FUTURE_FEATURE "future feature %.100s is not defined"
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
11
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
13 future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename)
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
14 {
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
15 int i;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
16 asdl_seq *names;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
17
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
18 assert(s->kind == ImportFrom_kind);
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
19
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
20 names = s->v.ImportFrom.names;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
21 for (i = 0; i < asdl_seq_LEN(names); i++) {
37606
f448d0075691 more low-hanging fruit to make code compile under a C++ compiler. Not
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37558
diff changeset
22 alias_ty name = (alias_ty)asdl_seq_GET(names, i);
35992
c0c12aa757e7 Reduce scope of feature
Neal Norwitz <nnorwitz@gmail.com>
parents: 35991
diff changeset
23 const char *feature = PyString_AsString(name->name);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
24 if (!feature)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
25 return 0;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) {
19158
97a3d3d7029f Refactor future feature handling
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19051
diff changeset
27 continue;
18609
59446d0f8341 Preliminary support for "from __future__ import generators" to enable
Guido van Rossum <guido@python.org>
parents: 17018
diff changeset
28 } else if (strcmp(feature, FUTURE_GENERATORS) == 0) {
22968
ba0236f84318 Removed more hair in support of future-generator stmts.
Tim Peters <tim.peters@gmail.com>
parents: 19407
diff changeset
29 continue;
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18612
diff changeset
30 } else if (strcmp(feature, FUTURE_DIVISION) == 0) {
19158
97a3d3d7029f Refactor future feature handling
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19051
diff changeset
31 ff->ff_features |= CO_FUTURE_DIVISION;
37418
cea54c9d921d Don't abbreviate ABS, use long name ABSOLUTE.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36726
diff changeset
32 } else if (strcmp(feature, FUTURE_ABSOLUTE_IMPORT) == 0) {
cea54c9d921d Don't abbreviate ABS, use long name ABSOLUTE.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36726
diff changeset
33 ff->ff_features |= CO_FUTURE_ABSOLUTE_IMPORT;
36726
bbf16fd024df from __future__ import with_statement addon for 'with', mostly written by
Thomas Wouters <thomas@python.org>
parents: 36712
diff changeset
34 } else if (strcmp(feature, FUTURE_WITH_STATEMENT) == 0) {
bbf16fd024df from __future__ import with_statement addon for 'with', mostly written by
Thomas Wouters <thomas@python.org>
parents: 36712
diff changeset
35 ff->ff_features |= CO_FUTURE_WITH_STATEMENT;
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16824
diff changeset
36 } else if (strcmp(feature, "braces") == 0) {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16824
diff changeset
37 PyErr_SetString(PyExc_SyntaxError,
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16824
diff changeset
38 "not a chance");
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
39 PyErr_SyntaxLocation(filename, s->lineno);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
40 return 0;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
41 } else {
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
42 PyErr_Format(PyExc_SyntaxError,
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
43 UNDEFINED_FUTURE_FEATURE, feature);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
44 PyErr_SyntaxLocation(filename, s->lineno);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
45 return 0;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
46 }
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
47 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
48 return 1;
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
49 }
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
50
35862
6867995a18a7 Prevent name pollution by making lots of internal functions static.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35742
diff changeset
51 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
52 future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename)
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
53 {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
54 int i, found_docstring = 0, done = 0, prev_line = 0;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
55
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
56 static PyObject *future;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
57 if (!future) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
58 future = PyString_InternFromString("__future__");
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
59 if (!future)
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
60 return 0;
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
61 }
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
62
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
63 if (!(mod->kind == Module_kind || mod->kind == Interactive_kind))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
64 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
65
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
66 /* A subsequent pass will detect future imports that don't
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
67 appear at the beginning of the file. There's one case,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
68 however, that is easier to handl here: A series of imports
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
69 joined by semi-colons, where the first import is a future
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
70 statement but some subsequent import has the future form
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
71 but is preceded by a regular import.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
72 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
73
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
74
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
75 for (i = 0; i < asdl_seq_LEN(mod->v.Module.body); i++) {
37606
f448d0075691 more low-hanging fruit to make code compile under a C++ compiler. Not
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37558
diff changeset
76 stmt_ty s = (stmt_ty)asdl_seq_GET(mod->v.Module.body, i);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
77
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
78 if (done && s->lineno > prev_line)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
79 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
80 prev_line = s->lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
81
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
82 /* The tests below will return from this function unless it is
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
83 still possible to find a future statement. The only things
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
84 that can precede a future statement are another future
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
85 statement and a doc string.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
86 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
87
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
88 if (s->kind == ImportFrom_kind) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
89 if (s->v.ImportFrom.module == future) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
90 if (done) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
91 PyErr_SetString(PyExc_SyntaxError,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
92 ERR_LATE_FUTURE);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
93 PyErr_SyntaxLocation(filename,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
94 s->lineno);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
95 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
96 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
97 if (!future_check_features(ff, s, filename))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
98 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
99 ff->ff_lineno = s->lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
100 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
101 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
102 done = 1;
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
103 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
104 else if (s->kind == Expr_kind && !found_docstring) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
105 expr_ty e = s->v.Expr.value;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
106 if (e->kind != Str_kind)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
107 done = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
108 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
109 found_docstring = 1;
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
110 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
111 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
112 done = 1;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
113 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
114 return 1;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
115 }
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
116
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
117
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
118 PyFutureFeatures *
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
119 PyFuture_FromAST(mod_ty mod, const char *filename)
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
120 {
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
121 PyFutureFeatures *ff;
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
122
37558
286c81689826 Use PyObject_* allocator since FutureFeatures is small
Neal Norwitz <nnorwitz@gmail.com>
parents: 37418
diff changeset
123 ff = (PyFutureFeatures *)PyObject_Malloc(sizeof(PyFutureFeatures));
39139
75a7106662a3 Handle more mem alloc issues found with failmalloc
Neal Norwitz <nnorwitz@gmail.com>
parents: 37606
diff changeset
124 if (ff == NULL) {
75a7106662a3 Handle more mem alloc issues found with failmalloc
Neal Norwitz <nnorwitz@gmail.com>
parents: 37606
diff changeset
125 PyErr_NoMemory();
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
126 return NULL;
39139
75a7106662a3 Handle more mem alloc issues found with failmalloc
Neal Norwitz <nnorwitz@gmail.com>
parents: 37606
diff changeset
127 }
19158
97a3d3d7029f Refactor future feature handling
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19051
diff changeset
128 ff->ff_features = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
129 ff->ff_lineno = -1;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
130
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
131 if (!future_parse(ff, mod, filename)) {
37558
286c81689826 Use PyObject_* allocator since FutureFeatures is small
Neal Norwitz <nnorwitz@gmail.com>
parents: 37418
diff changeset
132 PyObject_Free(ff);
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
133 return NULL;
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
134 }
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
135 return ff;
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
136 }