Mercurial > cpython-lru_cache-weakref
annotate Modules/parsermodule.c @ 4439:fb1237bf7022 legacy-trunk
Changed version to plain "1.4".
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Tue, 22 Oct 1996 03:09:46 +0000 |
| parents | f2f5cd7cb5b5 |
| children | 65d2d8e67da3 |
| rev | line source |
|---|---|
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1 /* parsermodule.c |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2 * |
| 4084 | 3 * Copyright 1995-1996 by Fred L. Drake, Jr. and Virginia Polytechnic |
| 4 * Institute and State University, Blacksburg, Virginia, USA. | |
| 5 * Portions copyright 1991-1995 by Stichting Mathematisch Centrum, | |
| 6 * Amsterdam, The Netherlands. Copying is permitted under the terms | |
| 7 * associated with the main Python distribution, with the additional | |
| 8 * restriction that this additional notice be included and maintained | |
| 9 * on all distributed copies. | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
10 * |
| 4084 | 11 * This module serves to replace the original parser module written |
| 12 * by Guido. The functionality is not matched precisely, but the | |
| 13 * original may be implemented on top of this. This is desirable | |
| 14 * since the source of the text to be parsed is now divorced from | |
| 15 * this interface. | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
16 * |
| 4084 | 17 * Unlike the prior interface, the ability to give a parse tree |
| 18 * produced by Python code as a tuple to the compiler is enabled by | |
| 19 * this module. See the documentation for more details. | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
20 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
21 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
22 #include "Python.h" /* general Python API */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
23 #include "graminit.h" /* symbols defined in the grammar */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
24 #include "node.h" /* internal parser structure */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
25 #include "token.h" /* token definitions */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
26 /* ISTERMINAL() / ISNONTERMINAL() */ |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
27 #include "compile.h" /* PyNode_Compile() */ |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
28 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
29 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
30 * All the "fudge" declarations are here: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
31 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
32 * This isn't part of the Python runtime, but it's in the library somewhere. |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
33 * Where it is varies a bit, so just declare it. Don't use any prototype; |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
34 * different systems declare it a little differently, and we don't need the |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
35 * extra warnings. |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
36 */ |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
37 extern char* strdup(); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
38 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
39 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
40 /* String constants used to initialize module attributes. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
41 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
42 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
43 static char* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
44 parser_copyright_string |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
45 = "Copyright 1995-1996 by Virginia Polytechnic Institute & State\n\ |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
46 University, Blacksburg, Virginia, USA, and Fred L. Drake, Jr., Reston,\n\ |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
47 Virginia, USA. Portions copyright 1991-1995 by Stichting Mathematisch\n\ |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
48 Centrum, Amsterdam, The Netherlands."; |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
49 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
50 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
51 static char* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
52 parser_doc_string |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
53 = "This is an interface to Python's internal parser."; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
54 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
55 static char* |
| 4084 | 56 parser_version_string = "0.4"; |
| 57 | |
| 58 | |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
59 typedef PyObject* (*SeqMaker) Py_PROTO((int length)); |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
60 typedef void (*SeqInserter) Py_PROTO((PyObject* sequence, |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
61 int index, |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
62 PyObject* element)); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
63 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
64 /* The function below is copyrigthed by Stichting Mathematisch Centrum. The |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
65 * original copyright statement is included below, and continues to apply |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
66 * in full to the function immediately following. All other material is |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
67 * original, copyrighted by Fred L. Drake, Jr. and Virginia Polytechnic |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
68 * Institute and State University. Changes were made to comply with the |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
69 * new naming conventions. Added arguments to provide support for creating |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
70 * lists as well as tuples, and optionally including the line numbers. |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
71 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
72 |
|
1406
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 /*********************************************************** |
|
2061
172ba04a5191
Added 1995 to copyright message.
Guido van Rossum <guido@python.org>
parents:
2055
diff
changeset
|
74 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, |
|
172ba04a5191
Added 1995 to copyright message.
Guido van Rossum <guido@python.org>
parents:
2055
diff
changeset
|
75 The Netherlands. |
|
1406
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
76 |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
77 All Rights Reserved |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
78 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
79 Permission to use, copy, modify, and distribute this software and its |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
80 documentation for any purpose and without fee is hereby granted, |
|
1406
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
81 provided that the above copyright notice appear in all copies and that |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
82 both that copyright notice and this permission notice appear in |
|
1406
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
83 supporting documentation, and that the names of Stichting Mathematisch |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
84 Centrum or CWI not be used in advertising or publicity pertaining to |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 distribution of the software without specific, written prior permission. |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
87 STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
88 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
90 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
91 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
92 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
93 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
94 |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 ******************************************************************/ |
|
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
96 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
97 static PyObject* |
| 4084 | 98 node2tuple(n, mkseq, addelem, lineno) |
| 99 node *n; /* node to convert */ | |
| 100 SeqMaker mkseq; /* create sequence */ | |
| 101 SeqInserter addelem; /* func. to add elem. in seq. */ | |
| 102 int lineno; /* include line numbers? */ | |
| 103 { | |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
104 if (n == NULL) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
105 Py_INCREF(Py_None); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
106 return Py_None; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
107 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
108 if (ISNONTERMINAL(TYPE(n))) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
109 int i; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
110 PyObject *v, *w; |
| 4084 | 111 v = mkseq(1 + NCH(n)); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
112 if (v == NULL) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
113 return v; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
114 w = PyInt_FromLong(TYPE(n)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
115 if (w == NULL) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
116 Py_DECREF(v); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
117 return NULL; |
|
1406
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
118 } |
| 4084 | 119 addelem(v, 0, w); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
120 for (i = 0; i < NCH(n); i++) { |
| 4084 | 121 w = node2tuple(CHILD(n, i), mkseq, addelem, lineno); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
122 if (w == NULL) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
123 Py_DECREF(v); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
124 return NULL; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
125 } |
| 4084 | 126 addelem(v, i+1, w); |
|
1406
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
127 } |
| 4084 | 128 return (v); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
129 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
130 else if (ISTERMINAL(TYPE(n))) { |
| 4084 | 131 PyObject *result = mkseq(2 + lineno); |
| 132 if (result != NULL) { | |
| 133 addelem(result, 0, PyInt_FromLong(TYPE(n))); | |
| 134 addelem(result, 1, PyString_FromString(STR(n))); | |
| 135 if (lineno == 1) | |
| 136 addelem(result, 2, PyInt_FromLong(n->n_lineno)); | |
| 137 } | |
| 138 return (result); | |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
139 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
140 else { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
141 PyErr_SetString(PyExc_SystemError, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
142 "unrecognized parse tree node type"); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
143 return NULL; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
144 } |
| 4084 | 145 } /* node2tuple() */ |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
146 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
147 * End of material copyrighted by Stichting Mathematisch Centrum. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
148 */ |
|
1406
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
149 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
150 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
151 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
152 /* There are two types of intermediate objects we're interested in: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
153 * 'eval' and 'exec' types. These constants can be used in the ast_type |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
154 * field of the object type to identify which any given object represents. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
155 * These should probably go in an external header to allow other extensions |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
156 * to use them, but then, we really should be using C++ too. ;-) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
157 * |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
158 * The PyAST_FRAGMENT type is not currently supported. Maybe not useful? |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
159 * Haven't decided yet. |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
160 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
161 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
162 #define PyAST_EXPR 1 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
163 #define PyAST_SUITE 2 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
164 #define PyAST_FRAGMENT 3 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
165 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
166 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
167 /* These are the internal objects and definitions required to implement the |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
168 * AST type. Most of the internal names are more reminiscent of the 'old' |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
169 * naming style, but the code uses the new naming convention. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
170 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
171 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
172 static PyObject* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
173 parser_error = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
174 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
175 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
176 typedef struct _PyAST_Object { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
177 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
178 PyObject_HEAD /* standard object header */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
179 node* ast_node; /* the node* returned by the parser */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
180 int ast_type; /* EXPR or SUITE ? */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
181 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
182 } PyAST_Object; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
183 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
184 |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
185 staticforward void parser_free Py_PROTO((PyAST_Object *ast)); |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
186 staticforward int parser_compare Py_PROTO((PyAST_Object *left, |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
187 PyAST_Object *right)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
188 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
189 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
190 /* static */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
191 PyTypeObject PyAST_Type = { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
192 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
193 PyObject_HEAD_INIT(&PyType_Type) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
194 0, |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
195 "ast", /* tp_name */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
196 sizeof(PyAST_Object), /* tp_basicsize */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
197 0, /* tp_itemsize */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
198 (destructor)parser_free, /* tp_dealloc */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
199 0, /* tp_print */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
200 0, /* tp_getattr */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
201 0, /* tp_setattr */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
202 (cmpfunc)parser_compare, /* tp_compare */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
203 0, /* tp_repr */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
204 0, /* tp_as_number */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
205 0, /* tp_as_sequence */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
206 0, /* tp_as_mapping */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
207 0, /* tp_hash */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
208 0, /* tp_call */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
209 0 /* tp_str */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
210 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
211 }; /* PyAST_Type */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
212 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
213 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
214 static int |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
215 parser_compare_nodes(left, right) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
216 node *left; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
217 node *right; |
| 4084 | 218 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
219 int j; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
220 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
221 if (TYPE(left) < TYPE(right)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
222 return (-1); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
223 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
224 if (TYPE(right) < TYPE(left)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
225 return (1); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
226 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
227 if (ISTERMINAL(TYPE(left))) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
228 return (strcmp(STR(left), STR(right))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
229 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
230 if (NCH(left) < NCH(right)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
231 return (-1); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
232 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
233 if (NCH(right) < NCH(left)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
234 return (1); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
235 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
236 for (j = 0; j < NCH(left); ++j) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
237 int v = parser_compare_nodes(CHILD(left, j), CHILD(right, j)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
238 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
239 if (v) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
240 return (v); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
241 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
242 return (0); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
243 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
244 } /* parser_compare_nodes() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
245 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
246 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
247 /* int parser_compare(PyAST_Object* left, PyAST_Object* right) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
248 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
249 * Comparison function used by the Python operators ==, !=, <, >, <=, >= |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
250 * This really just wraps a call to parser_compare_nodes() with some easy |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
251 * checks and protection code. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
252 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
253 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
254 static int |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
255 parser_compare(left, right) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
256 PyAST_Object *left; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
257 PyAST_Object *right; |
| 4084 | 258 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
259 if (left == right) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
260 return (0); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
261 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
262 if ((left == 0) || (right == 0)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
263 return (-1); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
264 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
265 return (parser_compare_nodes(left->ast_node, right->ast_node)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
266 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
267 } /* parser_compare() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
268 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
269 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
270 /* parser_newastobject(node* ast) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
271 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
272 * Allocates a new Python object representing an AST. This is simply the |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
273 * 'wrapper' object that holds a node* and allows it to be passed around in |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
274 * Python code. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
275 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
276 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
277 static PyObject* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
278 parser_newastobject(ast, type) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
279 node *ast; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
280 int type; |
| 4084 | 281 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
282 PyAST_Object* o = PyObject_NEW(PyAST_Object, &PyAST_Type); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
283 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
284 if (o != 0) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
285 o->ast_node = ast; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
286 o->ast_type = type; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
287 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
288 return ((PyObject*)o); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
289 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
290 } /* parser_newastobject() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
291 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
292 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
293 /* void parser_free(PyAST_Object* ast) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
294 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
295 * This is called by a del statement that reduces the reference count to 0. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
296 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
297 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
298 static void |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
299 parser_free(ast) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
300 PyAST_Object *ast; |
| 4084 | 301 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
302 PyNode_Free(ast->ast_node); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
303 PyMem_DEL(ast); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
304 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
305 } /* parser_free() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
306 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
307 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
308 /* parser_ast2tuple(PyObject* self, PyObject* args) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
309 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
310 * This provides conversion from a node* to a tuple object that can be |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
311 * returned to the Python-level caller. The AST object is not modified. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
312 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
313 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
314 static PyObject* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
315 parser_ast2tuple(self, args) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
316 PyObject *self; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
317 PyObject *args; |
| 4084 | 318 { |
| 319 PyObject *ast; | |
| 320 PyObject *line_option = 0; | |
| 321 PyObject *res = 0; | |
| 322 | |
| 323 if (PyArg_ParseTuple(args, "O!|O:ast2tuple", &PyAST_Type, &ast, | |
| 324 &line_option)) { | |
| 325 int lineno = 0; | |
| 326 if (line_option != 0) { | |
| 327 lineno = PyObject_IsTrue(line_option); | |
| 328 lineno = lineno ? 1 : 0; | |
| 329 } | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
330 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
331 * Convert AST into a tuple representation. Use Guido's function, |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
332 * since it's known to work already. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
333 */ |
| 4084 | 334 res = node2tuple(((PyAST_Object*)ast)->ast_node, |
| 335 PyTuple_New, PyTuple_SetItem, lineno); | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
336 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
337 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
338 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
339 } /* parser_ast2tuple() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
340 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
341 |
| 4084 | 342 /* parser_ast2tuple(PyObject* self, PyObject* args) |
| 343 * | |
| 344 * This provides conversion from a node* to a tuple object that can be | |
| 345 * returned to the Python-level caller. The AST object is not modified. | |
| 346 * | |
| 347 */ | |
| 348 static PyObject* | |
| 349 parser_ast2list(self, args) | |
| 350 PyObject *self; | |
| 351 PyObject *args; | |
| 352 { | |
| 353 PyObject *ast; | |
| 354 PyObject *line_option = 0; | |
| 355 PyObject *res = 0; | |
| 356 | |
| 357 if (PyArg_ParseTuple(args, "O!|O:ast2list", &PyAST_Type, &ast, | |
| 358 &line_option)) { | |
| 359 int lineno = 0; | |
| 360 if (line_option != 0) { | |
| 361 lineno = PyObject_IsTrue(line_option); | |
| 362 lineno = lineno ? 1 : 0; | |
| 363 } | |
| 364 /* | |
| 365 * Convert AST into a tuple representation. Use Guido's function, | |
| 366 * since it's known to work already. | |
| 367 */ | |
| 368 res = node2tuple(((PyAST_Object*)ast)->ast_node, | |
| 369 PyList_New, PyList_SetItem, lineno); | |
| 370 } | |
| 371 return (res); | |
| 372 | |
| 373 } /* parser_ast2list() */ | |
| 374 | |
| 375 | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
376 /* parser_compileast(PyObject* self, PyObject* args) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
377 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
378 * This function creates code objects from the parse tree represented by |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
379 * the passed-in data object. An optional file name is passed in as well. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
380 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
381 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
382 static PyObject* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
383 parser_compileast(self, args) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
384 PyObject *self; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
385 PyObject *args; |
| 4084 | 386 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
387 PyAST_Object* ast; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
388 PyObject* res = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
389 char* str = "<ast>"; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
390 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
391 if (PyArg_ParseTuple(args, "O!|s", &PyAST_Type, &ast, &str)) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
392 res = (PyObject*) PyNode_Compile(ast->ast_node, str); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
393 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
394 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
395 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
396 } /* parser_compileast() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
397 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
398 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
399 /* PyObject* parser_isexpr(PyObject* self, PyObject* args) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
400 * PyObject* parser_issuite(PyObject* self, PyObject* args) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
401 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
402 * Checks the passed-in AST object to determine if it is an expression or |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
403 * a statement suite, respectively. The return is a Python truth value. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
404 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
405 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
406 static PyObject* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
407 parser_isexpr(self, args) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
408 PyObject *self; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
409 PyObject *args; |
| 4084 | 410 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
411 PyAST_Object* ast; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
412 PyObject* res = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
413 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
414 if (PyArg_ParseTuple(args, "O!:isexpr", &PyAST_Type, &ast)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
415 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
416 * Check to see if the AST represents an expression or not. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
417 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
418 res = (ast->ast_type == PyAST_EXPR) ? Py_True : Py_False; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
419 Py_INCREF(res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
420 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
421 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
422 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
423 } /* parser_isexpr() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
424 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
425 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
426 static PyObject* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
427 parser_issuite(self, args) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
428 PyObject *self; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
429 PyObject *args; |
| 4084 | 430 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
431 PyAST_Object* ast; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
432 PyObject* res = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
433 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
434 if (PyArg_ParseTuple(args, "O!:issuite", &PyAST_Type, &ast)) { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
435 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
436 * Check to see if the AST represents an expression or not. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
437 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
438 res = (ast->ast_type == PyAST_EXPR) ? Py_False : Py_True; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
439 Py_INCREF(res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
440 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
441 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
442 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
443 } /* parser_issuite() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
444 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
445 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
446 /* err_string(char* message) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
447 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
448 * Sets the error string for an exception of type ParserError. |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
449 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
450 */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
451 static void |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
452 err_string(message) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
453 char *message; |
| 4084 | 454 { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
455 PyErr_SetString(parser_error, message); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
456 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
457 } /* err_string() */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
458 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
459 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
460 /* PyObject* parser_do_parse(PyObject* args, int type) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
461 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
462 * Internal function to actually execute the parse and return the result if |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
463 * successful, or set an exception if not. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
464 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
465 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
466 static PyObject* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
467 parser_do_parse(args, type) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
468 PyObject *args; |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
469 int type; |
| 4084 | 470 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
471 char* string = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
472 PyObject* res = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
473 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
474 if (PyArg_ParseTuple(args, "s", &string)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
475 node* n = PyParser_SimpleParseString(string, |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
476 (type == PyAST_EXPR) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
477 ? eval_input : file_input); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
478 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
479 if (n != 0) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
480 res = parser_newastobject(n, type); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
481 else |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
482 err_string("Could not parse string."); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
483 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
484 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
485 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
486 } /* parser_do_parse() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
487 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
488 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
489 /* PyObject* parser_expr(PyObject* self, PyObject* args) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
490 * PyObject* parser_suite(PyObject* self, PyObject* args) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
491 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
492 * External interfaces to the parser itself. Which is called determines if |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
493 * the parser attempts to recognize an expression ('eval' form) or statement |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
494 * suite ('exec' form). The real work is done by parser_do_parse() above. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
495 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
496 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
497 static PyObject* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
498 parser_expr(self, args) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
499 PyObject *self; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
500 PyObject *args; |
| 4084 | 501 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
502 return (parser_do_parse(args, PyAST_EXPR)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
503 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
504 } /* parser_expr() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
505 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
506 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
507 static PyObject* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
508 parser_suite(self, args) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
509 PyObject *self; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
510 PyObject *args; |
| 4084 | 511 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
512 return (parser_do_parse(args, PyAST_SUITE)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
513 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
514 } /* parser_suite() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
515 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
516 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
517 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
518 /* This is the messy part of the code. Conversion from a tuple to an AST |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
519 * object requires that the input tuple be valid without having to rely on |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
520 * catching an exception from the compiler. This is done to allow the |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
521 * compiler itself to remain fast, since most of its input will come from |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
522 * the parser directly, and therefore be known to be syntactically correct. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
523 * This validation is done to ensure that we don't core dump the compile |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
524 * phase, returning an exception instead. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
525 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
526 * Two aspects can be broken out in this code: creating a node tree from |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
527 * the tuple passed in, and verifying that it is indeed valid. It may be |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
528 * advantageous to expand the number of AST types to include funcdefs and |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
529 * lambdadefs to take advantage of the optimizer, recognizing those ASTs |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
530 * here. They are not necessary, and not quite as useful in a raw form. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
531 * For now, let's get expressions and suites working reliably. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
532 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
533 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
534 |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
535 staticforward node* build_node_tree Py_PROTO((PyObject *tuple)); |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
536 staticforward int validate_expr_tree Py_PROTO((node *tree)); |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
537 staticforward int validate_file_input Py_PROTO((node *tree)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
538 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
539 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
540 /* PyObject* parser_tuple2ast(PyObject* self, PyObject* args) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
541 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
542 * This is the public function, called from the Python code. It receives a |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
543 * single tuple object from the caller, and creates an AST object if the |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
544 * tuple can be validated. It does this by checking the first code of the |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
545 * tuple, and, if acceptable, builds the internal representation. If this |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
546 * step succeeds, the internal representation is validated as fully as |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
547 * possible with the various validate_*() routines defined below. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
548 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
549 * This function must be changed if support is to be added for PyAST_FRAGMENT |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
550 * AST objects. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
551 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
552 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
553 static PyObject* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
554 parser_tuple2ast(self, args) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
555 PyObject *self; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
556 PyObject *args; |
| 4084 | 557 { |
| 558 PyObject *ast = 0; | |
| 559 PyObject *tuple = 0; | |
| 560 PyObject *temp = 0; | |
| 561 int ok; | |
| 562 int start_sym; | |
| 563 | |
| 564 if (!PyArg_ParseTuple(args, "O:tuple2ast", &tuple)) | |
| 565 return (0); | |
| 566 if (!PySequence_Check(tuple)) { | |
| 567 PyErr_SetString(PyExc_ValueError, | |
| 568 "tuple2ast() requires a single sequence argument"); | |
| 569 return (0); | |
| 570 } | |
| 571 /* | |
| 572 * This mess of tests is written this way so we can use the abstract | |
| 573 * object interface (AOI). Unfortunately, the AOI increments reference | |
| 574 * counts, which requires that we store a pointer to retrieved object | |
| 575 * so we can DECREF it after the check. But we really should accept | |
| 576 * lists as well as tuples at the very least. | |
| 577 */ | |
| 578 ok = PyObject_Length(tuple) >= 2; | |
| 579 if (ok) { | |
| 580 temp = PySequence_GetItem(tuple, 0); | |
| 581 ok = (temp != NULL) && PyInt_Check(temp); | |
| 582 if (ok) | |
| 583 /* this is used after the initial checks: */ | |
| 584 start_sym = PyInt_AsLong(temp); | |
| 585 Py_XDECREF(temp); | |
| 586 } | |
| 587 if (ok) { | |
| 588 temp = PySequence_GetItem(tuple, 1); | |
| 589 ok = (temp != NULL) && PySequence_Check(temp); | |
| 590 Py_XDECREF(temp); | |
| 591 } | |
| 592 if (ok) { | |
| 593 temp = PySequence_GetItem(tuple, 1); | |
| 594 ok = (temp != NULL) && PyObject_Length(temp) >= 2; | |
| 595 if (ok) { | |
| 596 PyObject *temp2 = PySequence_GetItem(temp, 0); | |
| 597 if (temp2 != NULL) { | |
| 598 ok = PyInt_Check(temp2); | |
| 599 Py_DECREF(temp2); | |
| 600 } | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
601 } |
| 4084 | 602 Py_XDECREF(temp); |
| 603 } | |
| 604 /* If we've failed at some point, get out of here. */ | |
| 605 if (!ok) { | |
| 606 err_string("malformed sequence for tuple2ast()"); | |
| 607 return (0); | |
| 608 } | |
| 609 /* | |
| 610 * This might be a valid parse tree, but let's do a quick check | |
| 611 * before we jump the gun. | |
| 612 */ | |
| 613 if (start_sym == eval_input) { | |
| 614 /* Might be an eval form. */ | |
| 615 node* expression = build_node_tree(tuple); | |
| 616 | |
| 617 if ((expression != 0) && validate_expr_tree(expression)) | |
| 618 ast = parser_newastobject(expression, PyAST_EXPR); | |
| 619 } | |
| 620 else if (start_sym == file_input) { | |
| 621 /* This looks like an exec form so far. */ | |
| 622 node* suite_tree = build_node_tree(tuple); | |
| 623 | |
| 624 if ((suite_tree != 0) && validate_file_input(suite_tree)) | |
| 625 ast = parser_newastobject(suite_tree, PyAST_SUITE); | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
626 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
627 else |
| 4084 | 628 /* This is a fragment, and is not yet supported. Maybe they |
| 629 * will be if I find a use for them. | |
| 630 */ | |
| 631 err_string("Fragmentary parse trees not supported."); | |
| 632 | |
| 633 /* Make sure we throw an exception on all errors. We should never | |
| 634 * get this, but we'd do well to be sure something is done. | |
| 635 */ | |
| 636 if ((ast == 0) && !PyErr_Occurred()) | |
| 637 err_string("Unspecified ast error occurred."); | |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
638 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
639 return (ast); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
640 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
641 } /* parser_tuple2ast() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
642 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
643 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
644 /* int check_terminal_tuple() |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
645 * |
| 4084 | 646 * Check a tuple to determine that it is indeed a valid terminal |
| 647 * node. The node is known to be required as a terminal, so we throw | |
| 648 * an exception if there is a failure. | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
649 * |
| 4084 | 650 * The format of an acceptable terminal tuple is "(is[i])": the fact |
| 651 * that elem is a tuple and the integer is a valid terminal symbol | |
| 652 * has been established before this function is called. We must | |
| 653 * check the length of the tuple and the type of the second element | |
| 654 * and optional third element. We do *NOT* check the actual text of | |
| 655 * the string element, which we could do in many cases. This is done | |
| 656 * by the validate_*() functions which operate on the internal | |
| 657 * representation. | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
658 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
659 static int |
| 4084 | 660 check_terminal_tuple(elem) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
661 PyObject *elem; |
| 4084 | 662 { |
| 663 int len = PyObject_Length(elem); | |
| 664 int res = 1; | |
| 665 char* str = "Illegal terminal symbol; bad node length."; | |
| 666 | |
| 667 if ((len == 2) || (len == 3)) { | |
| 668 PyObject *temp = PySequence_GetItem(elem, 1); | |
| 669 res = PyString_Check(temp); | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
670 str = "Illegal terminal symbol; expected a string."; |
| 4084 | 671 if (res && (len == 3)) { |
| 672 PyObject* third = PySequence_GetItem(elem, 2); | |
| 673 res = PyInt_Check(third); | |
| 674 str = "Invalid third element of terminal node."; | |
| 675 Py_XDECREF(third); | |
| 676 } | |
| 677 Py_XDECREF(temp); | |
| 678 } | |
| 679 else { | |
| 680 res = 0; | |
| 681 } | |
| 682 if (!res) { | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
683 elem = Py_BuildValue("(os)", elem, str); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
684 PyErr_SetObject(parser_error, elem); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
685 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
686 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
687 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
688 } /* check_terminal_tuple() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
689 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
690 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
691 /* node* build_node_children() |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
692 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
693 * Iterate across the children of the current non-terminal node and build |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
694 * their structures. If successful, return the root of this portion of |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
695 * the tree, otherwise, 0. Any required exception will be specified already, |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
696 * and no memory will have been deallocated. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
697 * |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
698 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
699 static node* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
700 build_node_children(tuple, root, line_num) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
701 PyObject *tuple; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
702 node *root; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
703 int *line_num; |
| 4084 | 704 { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
705 int len = PyObject_Length(tuple); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
706 int i; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
707 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
708 for (i = 1; i < len; ++i) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
709 /* elem must always be a tuple, however simple */ |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
710 PyObject* elem = PySequence_GetItem(tuple, i); |
| 4084 | 711 int ok = elem != NULL; |
| 712 long type = 0; | |
| 713 char *strn = 0; | |
| 714 | |
| 715 if (ok) | |
| 716 ok = PySequence_Check(elem); | |
| 717 if (ok) { | |
| 718 PyObject *temp = PySequence_GetItem(elem, 0); | |
| 719 if (temp == NULL) | |
| 720 ok = 0; | |
| 721 else { | |
| 722 ok = PyInt_Check(temp); | |
| 723 if (ok) | |
| 724 type = PyInt_AsLong(temp); | |
| 725 Py_DECREF(temp); | |
| 726 } | |
| 727 } | |
| 728 if (!ok) { | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
729 PyErr_SetObject(parser_error, |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
730 Py_BuildValue("(os)", elem, |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
731 "Illegal node construct.")); |
| 4084 | 732 Py_XDECREF(elem); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
733 return (0); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
734 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
735 if (ISTERMINAL(type)) { |
| 4084 | 736 if (check_terminal_tuple(elem)) { |
| 737 PyObject *temp = PySequence_GetItem(elem, 1); | |
| 738 | |
| 739 strn = strdup(PyString_AsString(temp)); | |
| 740 Py_XDECREF(temp); | |
| 741 | |
| 742 if (PyObject_Length(elem) == 3) { | |
| 743 PyObject* temp = PySequence_GetItem(elem, 2); | |
| 744 *line_num = PyInt_AsLong(temp); | |
| 745 Py_DECREF(temp); | |
| 746 } | |
| 747 } | |
| 748 else { | |
| 749 Py_XDECREF(elem); | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
750 return (0); |
| 4084 | 751 } |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
752 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
753 else if (!ISNONTERMINAL(type)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
754 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
755 * It has to be one or the other; this is an error. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
756 * Throw an exception. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
757 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
758 PyErr_SetObject(parser_error, |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
759 Py_BuildValue("(os)", elem, |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
760 "Unknown node type.")); |
| 4084 | 761 Py_XDECREF(elem); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
762 return (0); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
763 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
764 PyNode_AddChild(root, type, strn, *line_num); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
765 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
766 if (ISNONTERMINAL(type)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
767 node* new_child = CHILD(root, i - 1); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
768 |
| 4084 | 769 if (new_child != build_node_children(elem, new_child, line_num)) { |
| 770 Py_XDECREF(elem); | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
771 return (0); |
| 4084 | 772 } |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
773 } |
| 4084 | 774 else if (type == NEWLINE) { /* It's true: we increment the */ |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
775 ++(*line_num); /* line number *after* the newline! */ |
| 4084 | 776 } |
| 777 Py_XDECREF(elem); | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
778 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
779 return (root); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
780 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
781 } /* build_node_children() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
782 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
783 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
784 static node* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
785 build_node_tree(tuple) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
786 PyObject *tuple; |
| 4084 | 787 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
788 node* res = 0; |
| 4084 | 789 PyObject *temp = PySequence_GetItem(tuple, 0); |
| 790 long num = -1; | |
| 791 | |
| 792 if (temp != NULL) | |
| 793 num = PyInt_AsLong(temp); | |
| 794 Py_XDECREF(temp); | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
795 if (ISTERMINAL(num)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
796 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
797 * The tuple is simple, but it doesn't start with a start symbol. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
798 * Throw an exception now and be done with it. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
799 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
800 tuple = Py_BuildValue("(os)", tuple, |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
801 "Illegal ast tuple; cannot start with terminal symbol."); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
802 PyErr_SetObject(parser_error, tuple); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
803 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
804 else if (ISNONTERMINAL(num)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
805 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
806 * Not efficient, but that can be handled later. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
807 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
808 int line_num = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
809 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
810 res = PyNode_New(num); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
811 if (res != build_node_children(tuple, res, &line_num)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
812 PyNode_Free(res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
813 res = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
814 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
815 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
816 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
817 /* The tuple is illegal -- if the number is neither TERMINAL nor |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
818 * NONTERMINAL, we can't use it. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
819 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
820 PyErr_SetObject(parser_error, |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
821 Py_BuildValue("(os)", tuple, |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
822 "Illegal component tuple.")); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
823 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
824 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
825 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
826 } /* build_node_tree() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
827 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
828 |
| 4092 | 829 #ifdef HAVE_OLD_CPP |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
830 #define VALIDATER(n) static int validate_/**/n Py_PROTO((node *tree)) |
| 4092 | 831 #else |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
832 #define VALIDATER(n) static int validate_##n Py_PROTO((node *tree)) |
| 4092 | 833 #endif |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
834 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
835 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
836 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
837 * Validation routines used within the validation section: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
838 */ |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
839 staticforward int validate_terminal Py_PROTO((node *terminal, |
|
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
840 int type, char *string)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
841 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
842 #define validate_ampersand(ch) validate_terminal(ch, AMPER, "&") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
843 #define validate_circumflex(ch) validate_terminal(ch, CIRCUMFLEX, "^") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
844 #define validate_colon(ch) validate_terminal(ch, COLON, ":") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
845 #define validate_comma(ch) validate_terminal(ch, COMMA, ",") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
846 #define validate_dedent(ch) validate_terminal(ch, DEDENT, "") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
847 #define validate_equal(ch) validate_terminal(ch, EQUAL, "=") |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
848 #define validate_indent(ch) validate_terminal(ch, INDENT, 0) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
849 #define validate_lparen(ch) validate_terminal(ch, LPAR, "(") |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
850 #define validate_newline(ch) validate_terminal(ch, NEWLINE, 0) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
851 #define validate_rparen(ch) validate_terminal(ch, RPAR, ")") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
852 #define validate_semi(ch) validate_terminal(ch, SEMI, ";") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
853 #define validate_star(ch) validate_terminal(ch, STAR, "*") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
854 #define validate_vbar(ch) validate_terminal(ch, VBAR, "|") |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
855 #define validate_doublestar(ch) validate_terminal(ch, DOUBLESTAR, "**") |
| 4084 | 856 #define validate_dot(ch) validate_terminal(ch, DOT, ".") |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
857 #define validate_name(ch, str) validate_terminal(ch, NAME, str) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
858 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
859 VALIDATER(node); VALIDATER(small_stmt); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
860 VALIDATER(class); VALIDATER(node); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
861 VALIDATER(parameters); VALIDATER(suite); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
862 VALIDATER(testlist); VALIDATER(varargslist); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
863 VALIDATER(fpdef); VALIDATER(fplist); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
864 VALIDATER(stmt); VALIDATER(simple_stmt); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
865 VALIDATER(expr_stmt); VALIDATER(power); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
866 VALIDATER(print_stmt); VALIDATER(del_stmt); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
867 VALIDATER(return_stmt); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
868 VALIDATER(raise_stmt); VALIDATER(import_stmt); |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
869 VALIDATER(global_stmt); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
870 VALIDATER(exec_stmt); VALIDATER(compound_stmt); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
871 VALIDATER(while); VALIDATER(for); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
872 VALIDATER(try); VALIDATER(except_clause); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
873 VALIDATER(test); VALIDATER(and_test); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
874 VALIDATER(not_test); VALIDATER(comparison); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
875 VALIDATER(comp_op); VALIDATER(expr); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
876 VALIDATER(xor_expr); VALIDATER(and_expr); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
877 VALIDATER(shift_expr); VALIDATER(arith_expr); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
878 VALIDATER(term); VALIDATER(factor); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
879 VALIDATER(atom); VALIDATER(lambdef); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
880 VALIDATER(trailer); VALIDATER(subscript); |
| 4084 | 881 VALIDATER(subscriptlist); VALIDATER(sliceop); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
882 VALIDATER(exprlist); VALIDATER(dictmaker); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
883 VALIDATER(arglist); VALIDATER(argument); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
884 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
885 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
886 #define is_even(n) (((n) & 1) == 0) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
887 #define is_odd(n) (((n) & 1) == 1) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
888 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
889 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
890 static int |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
891 validate_ntype(n, t) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
892 node *n; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
893 int t; |
| 4084 | 894 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
895 int res = (TYPE(n) == t); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
896 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
897 if (!res) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
898 char buffer[128]; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
899 sprintf(buffer, "Expected node type %d, got %d.", t, TYPE(n)); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
900 err_string(buffer); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
901 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
902 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
903 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
904 } /* validate_ntype() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
905 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
906 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
907 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
908 validate_numnodes(n, num, name) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
909 node *n; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
910 int num; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
911 const char *const name; |
| 4084 | 912 { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
913 if (NCH(n) != num) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
914 char buff[60]; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
915 sprintf(buff, "Illegal number of children for %s node.", name); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
916 err_string(buff); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
917 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
918 return (NCH(n) == num); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
919 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
920 } /* validate_numnodes() */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
921 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
922 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
923 static int |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
924 validate_terminal(terminal, type, string) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
925 node *terminal; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
926 int type; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
927 char *string; |
| 4084 | 928 { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
929 int res = (validate_ntype(terminal, type) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
930 && ((string == 0) || (strcmp(string, STR(terminal)) == 0))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
931 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
932 if (!res && !PyErr_Occurred()) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
933 char buffer[60]; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
934 sprintf(buffer, "Illegal terminal: expected \"%s\"", string); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
935 err_string(buffer); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
936 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
937 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
938 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
939 } /* validate_terminal() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
940 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
941 |
| 4084 | 942 /* X (',' X) [','] |
| 943 */ | |
| 944 static int | |
| 945 validate_repeating_list(tree, ntype, vfunc, name) | |
| 946 node *tree; | |
| 947 int ntype; | |
| 948 int (*vfunc)(); | |
| 949 const char *const name; | |
| 950 { | |
| 951 int nch = NCH(tree); | |
| 952 int res = (nch && validate_ntype(tree, ntype) | |
| 953 && vfunc(CHILD(tree, 0))); | |
| 954 | |
| 955 if (!res && !PyErr_Occurred()) | |
| 956 validate_numnodes(tree, 1, name); | |
| 957 else { | |
| 958 if (is_even(nch)) | |
| 959 res = validate_comma(CHILD(tree, --nch)); | |
| 960 if (res && nch > 1) { | |
| 961 int pos = 1; | |
| 962 for ( ; res && pos < nch; pos += 2) | |
| 963 res = (validate_comma(CHILD(tree, pos)) | |
| 964 && vfunc(CHILD(tree, pos + 1))); | |
| 965 } | |
| 966 } | |
| 967 return (res); | |
| 968 | |
| 969 } /* validate_repeating_list() */ | |
| 970 | |
| 971 | |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
972 /* VALIDATE(class) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
973 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
974 * classdef: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
975 * 'class' NAME ['(' testlist ')'] ':' suite |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
976 */ |
| 4084 | 977 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
978 validate_class(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
979 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
980 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
981 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
982 int res = validate_ntype(tree, classdef) && ((nch == 4) || (nch == 7)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
983 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
984 if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
985 res = (validate_name(CHILD(tree, 0), "class") |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
986 && validate_ntype(CHILD(tree, 1), NAME) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
987 && validate_colon(CHILD(tree, nch - 2)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
988 && validate_suite(CHILD(tree, nch - 1))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
989 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
990 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
991 validate_numnodes(tree, 4, "class"); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
992 if (res && (nch == 7)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
993 res = (validate_lparen(CHILD(tree, 2)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
994 && validate_testlist(CHILD(tree, 3)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
995 && validate_rparen(CHILD(tree, 4))); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
996 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
997 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
998 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
999 } /* validate_class() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1000 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1001 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1002 /* if_stmt: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1003 * 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1004 */ |
| 4084 | 1005 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1006 validate_if(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1007 node *tree; |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1008 { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1009 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1010 int res = (validate_ntype(tree, if_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1011 && (nch >= 4) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1012 && validate_name(CHILD(tree, 0), "if") |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1013 && validate_test(CHILD(tree, 1)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1014 && validate_colon(CHILD(tree, 2)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1015 && validate_suite(CHILD(tree, 3))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1016 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1017 if (res && ((nch % 4) == 3)) { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1018 /* ... 'else' ':' suite */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1019 res = (validate_name(CHILD(tree, nch - 3), "else") |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1020 && validate_colon(CHILD(tree, nch - 2)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1021 && validate_suite(CHILD(tree, nch - 1))); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1022 nch -= 3; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1023 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1024 else if (!res && !PyErr_Occurred()) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1025 validate_numnodes(tree, 4, "if"); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1026 if ((nch % 4) != 0) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1027 /* Will catch the case for nch < 4 */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1028 res = validate_numnodes(tree, 0, "if"); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1029 else if (res && (nch > 4)) { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1030 /* ... ('elif' test ':' suite)+ ... */ |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1031 int j = 4; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1032 while ((j < nch) && res) { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1033 res = (validate_name(CHILD(tree, j), "elif") |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1034 && validate_colon(CHILD(tree, j + 2)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1035 && validate_test(CHILD(tree, j + 1)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1036 && validate_suite(CHILD(tree, j + 3))); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1037 j += 4; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1038 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1039 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1040 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1041 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1042 } /* validate_if() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1043 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1044 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1045 /* parameters: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1046 * '(' [varargslist] ')' |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1047 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1048 */ |
| 4084 | 1049 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1050 validate_parameters(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1051 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1052 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1053 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1054 int res = validate_ntype(tree, parameters) && ((nch == 2) || (nch == 3)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1055 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1056 if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1057 res = (validate_lparen(CHILD(tree, 0)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1058 && validate_rparen(CHILD(tree, nch - 1))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1059 if (res && (nch == 3)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1060 res = validate_varargslist(CHILD(tree, 1)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1061 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1062 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1063 validate_numnodes(tree, 2, "parameters"); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1064 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1065 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1066 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1067 } /* validate_parameters() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1068 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1069 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1070 /* VALIDATE(suite) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1071 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1072 * suite: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1073 * simple_stmt |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1074 * | NEWLINE INDENT stmt+ DEDENT |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1075 */ |
| 4084 | 1076 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1077 validate_suite(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1078 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1079 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1080 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1081 int res = (validate_ntype(tree, suite) && ((nch == 1) || (nch >= 4))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1082 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1083 if (res && (nch == 1)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1084 res = validate_simple_stmt(CHILD(tree, 0)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1085 else if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1086 /* NEWLINE INDENT stmt+ DEDENT */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1087 res = (validate_newline(CHILD(tree, 0)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1088 && validate_indent(CHILD(tree, 1)) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1089 && validate_stmt(CHILD(tree, 2)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1090 && validate_dedent(CHILD(tree, nch - 1))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1091 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1092 if (res && (nch > 4)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1093 int i = 3; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1094 --nch; /* forget the DEDENT */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1095 for ( ; res && (i < nch); ++i) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1096 res = validate_stmt(CHILD(tree, i)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1097 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1098 else if (nch < 4) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1099 validate_numnodes(tree, 4, "suite"); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1100 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1101 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1102 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1103 } /* validate_suite() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1104 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1105 |
| 4084 | 1106 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1107 validate_testlist(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1108 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1109 { |
| 4084 | 1110 return (validate_repeating_list(tree, testlist, |
| 1111 validate_test, "testlist")); | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1112 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1113 } /* validate_testlist() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1114 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1115 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1116 /* VALIDATE(varargslist) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1117 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1118 * varargslist: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1119 * (fpdef ['=' test] ',')* ('*' NAME [',' '*' '*' NAME] | '*' '*' NAME) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1120 * | fpdef ['=' test] (',' fpdef ['=' test])* [','] |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1121 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1122 * (fpdef ['=' test] ',')* |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1123 * ('*' NAME [',' ('**'|'*' '*') NAME] |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1124 * | ('**'|'*' '*') NAME) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1125 * | fpdef ['=' test] (',' fpdef ['=' test])* [','] |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1126 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1127 */ |
| 4084 | 1128 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1129 validate_varargslist(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1130 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1131 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1132 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1133 int res = validate_ntype(tree, varargslist) && (nch != 0); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1134 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1135 if (res && (nch >= 2) && (TYPE(CHILD(tree, nch - 1)) == NAME)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1136 /* (fpdef ['=' test] ',')* |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1137 * ('*' NAME [',' '*' '*' NAME] | '*' '*' NAME) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1138 */ |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1139 int pos = 0; |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1140 int remaining = nch; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1141 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1142 while (res && (TYPE(CHILD(tree, pos)) == fpdef)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1143 res = validate_fpdef(CHILD(tree, pos)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1144 if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1145 if (TYPE(CHILD(tree, pos + 1)) == EQUAL) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1146 res = validate_test(CHILD(tree, pos + 2)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1147 pos += 2; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1148 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1149 res = res && validate_comma(CHILD(tree, pos + 1)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1150 pos += 2; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1151 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1152 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1153 if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1154 remaining = nch - pos; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1155 res = ((remaining == 2) || (remaining == 3) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1156 || (remaining == 5) || (remaining == 6)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1157 if (!res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1158 validate_numnodes(tree, 2, "varargslist"); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1159 else if (TYPE(CHILD(tree, pos)) == DOUBLESTAR) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1160 return ((remaining == 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1161 && validate_ntype(CHILD(tree, pos+1), NAME)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1162 else { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1163 res = validate_star(CHILD(tree, pos++)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1164 --remaining; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1165 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1166 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1167 if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1168 if (remaining == 2) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1169 res = (validate_star(CHILD(tree, pos)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1170 && validate_ntype(CHILD(tree, pos + 1), NAME)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1171 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1172 else { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1173 res = validate_ntype(CHILD(tree, pos++), NAME); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1174 if (res && (remaining >= 4)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1175 res = validate_comma(CHILD(tree, pos)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1176 if (--remaining == 3) |
|
4287
f2f5cd7cb5b5
(parsermodule.c): Fixed sloppy typo: '==' -> '='
Fred Drake <fdrake@acm.org>
parents:
4099
diff
changeset
|
1177 res = (validate_star(CHILD(tree, pos + 1)) |
|
f2f5cd7cb5b5
(parsermodule.c): Fixed sloppy typo: '==' -> '='
Fred Drake <fdrake@acm.org>
parents:
4099
diff
changeset
|
1178 && validate_star(CHILD(tree, pos + 2))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1179 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1180 validate_ntype(CHILD(tree, pos + 1), DOUBLESTAR); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1181 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1182 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1183 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1184 if (!res && !PyErr_Occurred()) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1185 err_string("Incorrect validation of variable arguments list."); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1186 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1187 else if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1188 /* fpdef ['=' test] (',' fpdef ['=' test])* [','] */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1189 if (TYPE(CHILD(tree, nch - 1)) == COMMA) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1190 --nch; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1191 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1192 /* fpdef ['=' test] (',' fpdef ['=' test])* */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1193 res = (is_odd(nch) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1194 && validate_fpdef(CHILD(tree, 0))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1195 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1196 if (res && (nch > 1)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1197 int pos = 1; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1198 if (TYPE(CHILD(tree, 1)) == EQUAL) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1199 res = validate_test(CHILD(tree, 2)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1200 pos += 2; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1201 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1202 /* ... (',' fpdef ['=' test])* */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1203 for ( ; res && (pos < nch); pos += 2) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1204 /* ',' fpdef */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1205 res = (validate_comma(CHILD(tree, pos)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1206 && validate_fpdef(CHILD(tree, pos + 1))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1207 if (res |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1208 && ((nch - pos) > 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1209 && (TYPE(CHILD(tree, pos + 2)) == EQUAL)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1210 /* ['=' test] */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1211 res = validate_test(CHILD(tree, pos + 3)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1212 pos += 2; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1213 } |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1214 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1215 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1216 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1217 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1218 err_string("Improperly formed argument list."); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1219 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1220 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1221 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1222 } /* validate_varargslist() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1223 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1224 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1225 /* VALIDATE(fpdef) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1226 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1227 * fpdef: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1228 * NAME |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1229 * | '(' fplist ')' |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1230 */ |
| 4084 | 1231 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1232 validate_fpdef(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1233 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1234 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1235 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1236 int res = validate_ntype(tree, fpdef); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1237 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1238 if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1239 if (nch == 1) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1240 res = validate_ntype(CHILD(tree, 0), NAME); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1241 else if (nch == 3) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1242 res = (validate_lparen(CHILD(tree, 0)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1243 && validate_fplist(CHILD(tree, 1)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1244 && validate_rparen(CHILD(tree, 2))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1245 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1246 validate_numnodes(tree, 1, "fpdef"); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1247 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1248 return (res); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1249 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1250 } /* validate_fpdef() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1251 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1252 |
| 4084 | 1253 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1254 validate_fplist(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1255 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1256 { |
| 4084 | 1257 return (validate_repeating_list(tree, fplist, |
| 1258 validate_fpdef, "fplist")); | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1259 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1260 } /* validate_fplist() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1261 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1262 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1263 /* simple_stmt | compound_stmt |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1264 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1265 */ |
| 4084 | 1266 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1267 validate_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1268 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1269 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1270 int res = (validate_ntype(tree, stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1271 && validate_numnodes(tree, 1, "stmt")); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1272 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1273 if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1274 tree = CHILD(tree, 0); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1275 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1276 if (TYPE(tree) == simple_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1277 res = validate_simple_stmt(tree); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1278 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1279 res = validate_compound_stmt(tree); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1280 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1281 return (res); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1282 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1283 } /* validate_stmt() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1284 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1285 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1286 /* small_stmt (';' small_stmt)* [';'] NEWLINE |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1287 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1288 */ |
| 4084 | 1289 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1290 validate_simple_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1291 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1292 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1293 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1294 int res = (validate_ntype(tree, simple_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1295 && (nch >= 2) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1296 && validate_small_stmt(CHILD(tree, 0)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1297 && validate_newline(CHILD(tree, nch - 1))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1298 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1299 if (nch < 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1300 res = validate_numnodes(tree, 2, "simple_stmt"); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1301 --nch; /* forget the NEWLINE */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1302 if (res && is_even(nch)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1303 res = validate_semi(CHILD(tree, --nch)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1304 if (res && (nch > 2)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1305 int i; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1306 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1307 for (i = 1; res && (i < nch); i += 2) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1308 res = (validate_semi(CHILD(tree, i)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1309 && validate_small_stmt(CHILD(tree, i + 1))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1310 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1311 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1312 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1313 } /* validate_simple_stmt() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1314 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1315 |
| 4084 | 1316 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1317 validate_small_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1318 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1319 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1320 int nch = NCH(tree); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1321 int res = (validate_numnodes(tree, 1, "small_stmt") |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1322 && ((TYPE(CHILD(tree, 0)) == expr_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1323 || (TYPE(CHILD(tree, 0)) == print_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1324 || (TYPE(CHILD(tree, 0)) == del_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1325 || (TYPE(CHILD(tree, 0)) == pass_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1326 || (TYPE(CHILD(tree, 0)) == flow_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1327 || (TYPE(CHILD(tree, 0)) == import_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1328 || (TYPE(CHILD(tree, 0)) == global_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1329 || (TYPE(CHILD(tree, 0)) == exec_stmt))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1330 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1331 if (res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1332 res = validate_node(CHILD(tree, 0)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1333 else if (nch == 1) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1334 char buffer[60]; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1335 sprintf(buffer, "Unrecognized child node of small_stmt: %d.", |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1336 TYPE(CHILD(tree, 0))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1337 err_string(buffer); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1338 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1339 return (res); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1340 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1341 } /* validate_small_stmt */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1342 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1343 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1344 /* compound_stmt: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1345 * if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1346 */ |
| 4084 | 1347 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1348 validate_compound_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1349 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1350 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1351 int res = (validate_ntype(tree, compound_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1352 && validate_numnodes(tree, 1, "compound_stmt")); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1353 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1354 if (!res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1355 return (0); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1356 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1357 tree = CHILD(tree, 0); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1358 res = ((TYPE(tree) == if_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1359 || (TYPE(tree) == while_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1360 || (TYPE(tree) == for_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1361 || (TYPE(tree) == try_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1362 || (TYPE(tree) == funcdef) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1363 || (TYPE(tree) == classdef)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1364 if (res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1365 res = validate_node(tree); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1366 else { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1367 char buffer[60]; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1368 sprintf(buffer, "Illegal compound statement type: %d.", TYPE(tree)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1369 err_string(buffer); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1370 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1371 return (res); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1372 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1373 } /* validate_compound_stmt() */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1374 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1375 |
| 4084 | 1376 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1377 validate_expr_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1378 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1379 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1380 int j; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1381 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1382 int res = (validate_ntype(tree, expr_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1383 && is_odd(nch) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1384 && validate_testlist(CHILD(tree, 0))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1385 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1386 for (j = 1; res && (j < nch); j += 2) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1387 res = (validate_equal(CHILD(tree, j)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1388 && validate_testlist(CHILD(tree, j + 1))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1389 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1390 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1391 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1392 } /* validate_expr_stmt() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1393 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1394 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1395 /* print_stmt: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1396 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1397 * 'print' (test ',')* [test] |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1398 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1399 */ |
| 4084 | 1400 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1401 validate_print_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1402 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1403 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1404 int j; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1405 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1406 int res = (validate_ntype(tree, print_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1407 && (nch != 0) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1408 && validate_name(CHILD(tree, 0), "print")); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1409 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1410 if (res && is_even(nch)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1411 res = validate_test(CHILD(tree, nch - 1)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1412 --nch; |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1413 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1414 else if (!res && !PyErr_Occurred()) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1415 validate_numnodes(tree, 1, "print_stmt"); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1416 for (j = 1; res && (j < nch); j += 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1417 res = (validate_test(CHILD(tree, j)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1418 && validate_ntype(CHILD(tree, j + 1), COMMA)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1419 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1420 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1421 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1422 } /* validate_print_stmt() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1423 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1424 |
| 4084 | 1425 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1426 validate_del_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1427 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1428 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1429 return (validate_numnodes(tree, 2, "del_stmt") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1430 && validate_name(CHILD(tree, 0), "del") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1431 && validate_exprlist(CHILD(tree, 1))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1432 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1433 } /* validate_del_stmt() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1434 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1435 |
| 4084 | 1436 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1437 validate_return_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1438 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1439 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1440 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1441 int res = (validate_ntype(tree, return_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1442 && ((nch == 1) || (nch == 2)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1443 && validate_name(CHILD(tree, 0), "return")); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1444 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1445 if (res && (nch == 2)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1446 res = validate_testlist(CHILD(tree, 1)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1447 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1448 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1449 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1450 } /* validate_return_stmt() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1451 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1452 |
| 4084 | 1453 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1454 validate_raise_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1455 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1456 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1457 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1458 int res = (validate_ntype(tree, raise_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1459 && ((nch == 2) || (nch == 4) || (nch == 6))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1460 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1461 if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1462 res = (validate_name(CHILD(tree, 0), "raise") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1463 && validate_test(CHILD(tree, 1))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1464 if (res && nch > 2) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1465 res = (validate_comma(CHILD(tree, 2)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1466 && validate_test(CHILD(tree, 3))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1467 if (res && (nch > 4)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1468 res = (validate_comma(CHILD(tree, 4)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1469 && validate_test(CHILD(tree, 5))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1470 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1471 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1472 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1473 validate_numnodes(tree, 2, "raise"); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1474 if (res && (nch == 4)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1475 res = (validate_comma(CHILD(tree, 2)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1476 && validate_test(CHILD(tree, 3))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1477 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1478 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1479 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1480 } /* validate_raise_stmt() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1481 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1482 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1483 /* import_stmt: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1484 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1485 * 'import' dotted_name (',' dotted_name)* |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1486 * | 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1487 */ |
| 4084 | 1488 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1489 validate_import_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1490 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1491 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1492 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1493 int res = (validate_ntype(tree, import_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1494 && (nch >= 2) && is_even(nch) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1495 && validate_ntype(CHILD(tree, 0), NAME) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1496 && validate_ntype(CHILD(tree, 1), dotted_name)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1497 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1498 if (res && (strcmp(STR(CHILD(tree, 0)), "import") == 0)) { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1499 int j; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1500 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1501 for (j = 2; res && (j < nch); j += 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1502 res = (validate_comma(CHILD(tree, j)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1503 && validate_ntype(CHILD(tree, j + 1), dotted_name)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1504 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1505 else if (res && validate_name(CHILD(tree, 0), "from")) { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1506 res = ((nch >= 4) && is_even(nch) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1507 && validate_name(CHILD(tree, 2), "import")); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1508 if (nch == 4) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1509 res = ((TYPE(CHILD(tree, 3)) == NAME) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1510 || (TYPE(CHILD(tree, 3)) == STAR)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1511 if (!res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1512 err_string("Illegal import statement."); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1513 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1514 else { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1515 /* 'from' NAME 'import' NAME (',' NAME)+ */ |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1516 int j; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1517 res = validate_ntype(CHILD(tree, 3), NAME); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1518 for (j = 4; res && (j < nch); j += 2) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1519 res = (validate_comma(CHILD(tree, j)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1520 && validate_ntype(CHILD(tree, j + 1), NAME)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1521 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1522 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1523 else |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1524 res = 0; |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1525 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1526 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1527 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1528 } /* validate_import_stmt() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1529 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1530 |
| 4084 | 1531 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1532 validate_global_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1533 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1534 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1535 int j; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1536 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1537 int res = (validate_ntype(tree, global_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1538 && is_even(nch) && (nch >= 2)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1539 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1540 if (res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1541 res = (validate_name(CHILD(tree, 0), "global") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1542 && validate_ntype(CHILD(tree, 1), NAME)); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1543 for (j = 2; res && (j < nch); j += 2) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1544 res = (validate_comma(CHILD(tree, j)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1545 && validate_ntype(CHILD(tree, j + 1), NAME)); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1546 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1547 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1548 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1549 } /* validate_global_stmt() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1550 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1551 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1552 /* exec_stmt: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1553 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1554 * 'exec' expr ['in' test [',' test]] |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1555 */ |
| 4084 | 1556 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1557 validate_exec_stmt(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1558 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1559 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1560 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1561 int res = (validate_ntype(tree, exec_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1562 && ((nch == 2) || (nch == 4) || (nch == 6)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1563 && validate_name(CHILD(tree, 0), "exec") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1564 && validate_expr(CHILD(tree, 1))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1565 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1566 if (!res && !PyErr_Occurred()) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1567 err_string("Illegal exec statement."); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1568 if (res && (nch > 2)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1569 res = (validate_name(CHILD(tree, 2), "in") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1570 && validate_test(CHILD(tree, 3))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1571 if (res && (nch == 6)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1572 res = (validate_comma(CHILD(tree, 4)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1573 && validate_test(CHILD(tree, 5))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1574 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1575 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1576 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1577 } /* validate_exec_stmt() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1578 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1579 |
| 4084 | 1580 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1581 validate_while(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1582 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1583 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1584 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1585 int res = (validate_ntype(tree, while_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1586 && ((nch == 4) || (nch == 7)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1587 && validate_name(CHILD(tree, 0), "while") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1588 && validate_test(CHILD(tree, 1)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1589 && validate_colon(CHILD(tree, 2)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1590 && validate_suite(CHILD(tree, 3))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1591 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1592 if (res && (nch == 7)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1593 res = (validate_name(CHILD(tree, 4), "else") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1594 && validate_colon(CHILD(tree, 5)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1595 && validate_suite(CHILD(tree, 6))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1596 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1597 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1598 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1599 } /* validate_while() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1600 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1601 |
| 4084 | 1602 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1603 validate_for(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1604 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1605 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1606 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1607 int res = (validate_ntype(tree, for_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1608 && ((nch == 6) || (nch == 9)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1609 && validate_name(CHILD(tree, 0), "for") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1610 && validate_exprlist(CHILD(tree, 1)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1611 && validate_name(CHILD(tree, 2), "in") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1612 && validate_testlist(CHILD(tree, 3)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1613 && validate_colon(CHILD(tree, 4)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1614 && validate_suite(CHILD(tree, 5))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1615 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1616 if (res && (nch == 9)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1617 res = (validate_name(CHILD(tree, 6), "else") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1618 && validate_colon(CHILD(tree, 7)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1619 && validate_suite(CHILD(tree, 8))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1620 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1621 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1622 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1623 } /* validate_for() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1624 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1625 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1626 /* try_stmt: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1627 * 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1628 * | 'try' ':' suite 'finally' ':' suite |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1629 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1630 */ |
| 4084 | 1631 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1632 validate_try(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1633 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1634 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1635 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1636 int pos = 3; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1637 int res = (validate_ntype(tree, try_stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1638 && (nch >= 6) && ((nch % 3) == 0)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1639 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1640 if (res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1641 res = (validate_name(CHILD(tree, 0), "try") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1642 && validate_colon(CHILD(tree, 1)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1643 && validate_suite(CHILD(tree, 2)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1644 && validate_colon(CHILD(tree, nch - 2)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1645 && validate_suite(CHILD(tree, nch - 1))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1646 else { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1647 const char* name = "execpt"; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1648 char buffer[60]; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1649 if (TYPE(CHILD(tree, nch - 3)) != except_clause) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1650 name = STR(CHILD(tree, nch - 3)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1651 sprintf(buffer, "Illegal number of children for try/%s node.", name); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1652 err_string(buffer); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1653 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1654 /* Skip past except_clause sections: */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1655 while (res && (TYPE(CHILD(tree, pos)) == except_clause)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1656 res = (validate_except_clause(CHILD(tree, pos)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1657 && validate_colon(CHILD(tree, pos + 1)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1658 && validate_suite(CHILD(tree, pos + 2))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1659 pos += 3; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1660 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1661 if (res && (pos < nch)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1662 res = validate_ntype(CHILD(tree, pos), NAME); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1663 if (res && (strcmp(STR(CHILD(tree, pos)), "finally") == 0)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1664 res = (validate_numnodes(tree, 6, "try/finally") |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1665 && validate_colon(CHILD(tree, 4)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1666 && validate_suite(CHILD(tree, 5))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1667 else if (res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1668 if (nch == (pos + 3)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1669 res = ((strcmp(STR(CHILD(tree, pos)), "except") == 0) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1670 || (strcmp(STR(CHILD(tree, pos)), "else") == 0)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1671 if (!res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1672 err_string("Illegal trailing triple in try statement."); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1673 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1674 else if (nch == (pos + 6)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1675 res = (validate_name(CHILD(tree, pos), "except") |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1676 && validate_colon(CHILD(tree, pos + 1)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1677 && validate_suite(CHILD(tree, pos + 2)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1678 && validate_name(CHILD(tree, pos + 3), "else")); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1679 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1680 res = validate_numnodes(tree, pos + 3, "try/except"); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1681 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1682 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1683 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1684 } /* validate_try() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1685 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1686 |
| 4084 | 1687 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1688 validate_except_clause(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1689 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1690 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1691 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1692 int res = (validate_ntype(tree, except_clause) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1693 && ((nch == 1) || (nch == 2) || (nch == 4)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1694 && validate_name(CHILD(tree, 0), "except")); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1695 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1696 if (res && (nch > 1)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1697 res = validate_test(CHILD(tree, 1)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1698 if (res && (nch == 4)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1699 res = (validate_comma(CHILD(tree, 2)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1700 && validate_test(CHILD(tree, 3))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1701 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1702 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1703 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1704 } /* validate_except_clause() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1705 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1706 |
| 4084 | 1707 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1708 validate_test(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1709 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1710 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1711 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1712 int res = validate_ntype(tree, test) && is_odd(nch); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1713 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1714 if (res && (TYPE(CHILD(tree, 0)) == lambdef)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1715 res = ((nch == 1) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1716 && validate_lambdef(CHILD(tree, 0))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1717 else if (res) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1718 int pos; |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1719 res = validate_and_test(CHILD(tree, 0)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1720 for (pos = 1; res && (pos < nch); pos += 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1721 res = (validate_name(CHILD(tree, pos), "or") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1722 && validate_and_test(CHILD(tree, pos + 1))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1723 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1724 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1725 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1726 } /* validate_test() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1727 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1728 |
| 4084 | 1729 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1730 validate_and_test(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1731 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1732 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1733 int pos; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1734 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1735 int res = (validate_ntype(tree, and_test) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1736 && is_odd(nch) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1737 && validate_not_test(CHILD(tree, 0))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1738 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1739 for (pos = 1; res && (pos < nch); pos += 2) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1740 res = (validate_name(CHILD(tree, pos), "and") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1741 && validate_not_test(CHILD(tree, 0))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1742 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1743 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1744 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1745 } /* validate_and_test() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1746 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1747 |
| 4084 | 1748 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1749 validate_not_test(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1750 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1751 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1752 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1753 int res = validate_ntype(tree, not_test) && ((nch == 1) || (nch == 2)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1754 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1755 if (res) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1756 if (nch == 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1757 res = (validate_name(CHILD(tree, 0), "not") |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1758 && validate_not_test(CHILD(tree, 1))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1759 else if (nch == 1) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1760 res = validate_comparison(CHILD(tree, 0)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1761 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1762 return (res); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1763 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1764 } /* validate_not_test() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1765 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1766 |
| 4084 | 1767 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1768 validate_comparison(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1769 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1770 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1771 int pos; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1772 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1773 int res = (validate_ntype(tree, comparison) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1774 && is_odd(nch) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1775 && validate_expr(CHILD(tree, 0))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1776 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1777 for (pos = 1; res && (pos < nch); pos += 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1778 res = (validate_comp_op(CHILD(tree, pos)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1779 && validate_expr(CHILD(tree, pos + 1))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1780 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1781 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1782 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1783 } /* validate_comparison() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1784 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1785 |
| 4084 | 1786 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1787 validate_comp_op(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1788 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1789 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1790 int res = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1791 int nch = NCH(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1792 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1793 if (!validate_ntype(tree, comp_op)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1794 return (0); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1795 if (nch == 1) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1796 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1797 * Only child will be a terminal with a well-defined symbolic name |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1798 * or a NAME with a string of either 'is' or 'in' |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1799 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1800 tree = CHILD(tree, 0); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1801 switch (TYPE(tree)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1802 case LESS: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1803 case GREATER: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1804 case EQEQUAL: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1805 case EQUAL: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1806 case LESSEQUAL: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1807 case GREATEREQUAL: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1808 case NOTEQUAL: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1809 res = 1; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1810 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1811 case NAME: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1812 res = ((strcmp(STR(tree), "in") == 0) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1813 || (strcmp(STR(tree), "is") == 0)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1814 if (!res) { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1815 char buff[128]; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1816 sprintf(buff, "Illegal operator: '%s'.", STR(tree)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1817 err_string(buff); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1818 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1819 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1820 default: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1821 err_string("Illegal comparison operator type."); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1822 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1823 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1824 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1825 else if (res = validate_numnodes(tree, 2, "comp_op")) { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1826 res = (validate_ntype(CHILD(tree, 0), NAME) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1827 && validate_ntype(CHILD(tree, 1), NAME) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1828 && (((strcmp(STR(CHILD(tree, 0)), "is") == 0) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1829 && (strcmp(STR(CHILD(tree, 1)), "not") == 0)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1830 || ((strcmp(STR(CHILD(tree, 0)), "not") == 0) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1831 && (strcmp(STR(CHILD(tree, 1)), "in") == 0)))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1832 if (!res && !PyErr_Occurred()) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1833 err_string("Unknown comparison operator."); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1834 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1835 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1836 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1837 } /* validate_comp_op() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1838 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1839 |
| 4084 | 1840 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1841 validate_expr(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1842 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1843 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1844 int j; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1845 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1846 int res = (validate_ntype(tree, expr) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1847 && is_odd(nch) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1848 && validate_xor_expr(CHILD(tree, 0))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1849 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1850 for (j = 2; res && (j < nch); j += 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1851 res = (validate_xor_expr(CHILD(tree, j)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1852 && validate_vbar(CHILD(tree, j - 1))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1853 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1854 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1855 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1856 } /* validate_expr() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1857 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1858 |
| 4084 | 1859 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1860 validate_xor_expr(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1861 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1862 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1863 int j; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1864 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1865 int res = (validate_ntype(tree, xor_expr) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1866 && is_odd(nch) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1867 && validate_and_expr(CHILD(tree, 0))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1868 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1869 for (j = 2; res && (j < nch); j += 2) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1870 res = (validate_circumflex(CHILD(tree, j - 1)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1871 && validate_and_expr(CHILD(tree, j))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1872 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1873 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1874 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1875 } /* validate_xor_expr() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1876 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1877 |
| 4084 | 1878 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1879 validate_and_expr(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1880 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1881 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1882 int pos; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1883 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1884 int res = (validate_ntype(tree, and_expr) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1885 && is_odd(nch) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1886 && validate_shift_expr(CHILD(tree, 0))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1887 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1888 for (pos = 1; res && (pos < nch); pos += 2) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1889 res = (validate_ampersand(CHILD(tree, pos)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1890 && validate_shift_expr(CHILD(tree, pos + 1))); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1891 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1892 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1893 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1894 } /* validate_and_expr() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1895 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1896 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1897 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1898 validate_chain_two_ops(tree, termvalid, op1, op2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1899 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1900 int (*termvalid)(); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1901 int op1; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1902 int op2; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1903 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1904 int pos = 1; |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1905 int nch = NCH(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1906 int res = (is_odd(nch) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1907 && (*termvalid)(CHILD(tree, 0))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1908 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1909 for ( ; res && (pos < nch); pos += 2) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1910 if (TYPE(CHILD(tree, pos)) != op1) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1911 res = validate_ntype(CHILD(tree, pos), op2); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1912 if (res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1913 res = (*termvalid)(CHILD(tree, pos + 1)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1914 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1915 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1916 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1917 } /* validate_chain_two_ops() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1918 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1919 |
| 4084 | 1920 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1921 validate_shift_expr(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1922 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1923 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1924 return (validate_ntype(tree, shift_expr) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1925 && validate_chain_two_ops(tree, validate_arith_expr, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1926 LEFTSHIFT, RIGHTSHIFT)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1927 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1928 } /* validate_shift_expr() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1929 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1930 |
| 4084 | 1931 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1932 validate_arith_expr(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1933 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1934 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1935 return (validate_ntype(tree, arith_expr) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1936 && validate_chain_two_ops(tree, validate_term, PLUS, MINUS)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1937 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1938 } /* validate_arith_expr() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1939 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1940 |
| 4084 | 1941 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1942 validate_term(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1943 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1944 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1945 int pos = 1; |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1946 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1947 int res = (validate_ntype(tree, term) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1948 && is_odd(nch) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1949 && validate_factor(CHILD(tree, 0))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1950 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1951 for ( ; res && (pos < nch); pos += 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1952 res = (((TYPE(CHILD(tree, pos)) == STAR) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1953 || (TYPE(CHILD(tree, pos)) == SLASH) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1954 || (TYPE(CHILD(tree, pos)) == PERCENT)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1955 && validate_factor(CHILD(tree, pos + 1))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1956 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1957 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1958 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1959 } /* validate_term() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1960 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1961 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1962 /* factor: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1963 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1964 * factor: ('+'|'-'|'~') factor | power |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1965 */ |
| 4084 | 1966 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1967 validate_factor(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1968 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1969 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1970 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1971 int res = (validate_ntype(tree, factor) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1972 && (((nch == 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1973 && ((TYPE(CHILD(tree, 0)) == PLUS) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1974 || (TYPE(CHILD(tree, 0)) == MINUS) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1975 || (TYPE(CHILD(tree, 0)) == TILDE)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1976 && validate_factor(CHILD(tree, 1))) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1977 || ((nch == 1) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1978 && validate_power(CHILD(tree, 0))))); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1979 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1980 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1981 } /* validate_factor() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1982 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
1983 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1984 /* power: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1985 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1986 * power: atom trailer* ('**' factor)* |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1987 */ |
| 4084 | 1988 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1989 validate_power(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1990 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1991 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1992 int pos = 1; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1993 int nch = NCH(tree); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1994 int res = (validate_ntype(tree, power) && (nch >= 1) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1995 && validate_atom(CHILD(tree, 0))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1996 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1997 while (res && (pos < nch) && (TYPE(CHILD(tree, pos)) == trailer)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1998 res = validate_trailer(CHILD(tree, pos++)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
1999 if (res && (pos < nch)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2000 if (!is_even(nch - pos)) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2001 err_string("Illegal number of nodes for 'power'."); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2002 return (0); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2003 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2004 for ( ; res && (pos < (nch - 1)); pos += 2) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2005 res = (validate_doublestar(CHILD(tree, pos)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2006 && validate_factor(CHILD(tree, pos + 1))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2007 } |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2008 return (res); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2009 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2010 } /* validate_power() */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2011 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2012 |
| 4084 | 2013 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2014 validate_atom(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2015 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2016 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2017 int pos; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2018 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2019 int res = validate_ntype(tree, atom) && (nch >= 1); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2020 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2021 if (res) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2022 switch (TYPE(CHILD(tree, 0))) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2023 case LPAR: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2024 res = ((nch <= 3) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2025 && (validate_rparen(CHILD(tree, nch - 1)))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2026 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2027 if (res && (nch == 3)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2028 res = validate_testlist(CHILD(tree, 1)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2029 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2030 case LSQB: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2031 res = ((nch <= 3) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2032 && validate_ntype(CHILD(tree, nch - 1), RSQB)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2033 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2034 if (res && (nch == 3)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2035 res = validate_testlist(CHILD(tree, 1)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2036 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2037 case LBRACE: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2038 res = ((nch <= 3) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2039 && validate_ntype(CHILD(tree, nch - 1), RBRACE)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2040 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2041 if (res && (nch == 3)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2042 res = validate_dictmaker(CHILD(tree, 1)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2043 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2044 case BACKQUOTE: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2045 res = ((nch == 3) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2046 && validate_testlist(CHILD(tree, 1)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2047 && validate_ntype(CHILD(tree, 2), BACKQUOTE)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2048 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2049 case NAME: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2050 case NUMBER: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2051 res = (nch == 1); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2052 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2053 case STRING: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2054 for (pos = 1; res && (pos < nch); ++pos) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2055 res = validate_ntype(CHILD(tree, pos), STRING); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2056 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2057 default: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2058 res = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2059 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2060 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2061 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2062 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2063 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2064 } /* validate_atom() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2065 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2066 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2067 /* funcdef: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2068 * 'def' NAME parameters ':' suite |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2069 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2070 */ |
| 4084 | 2071 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2072 validate_funcdef(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2073 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2074 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2075 return (validate_ntype(tree, funcdef) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2076 && validate_numnodes(tree, 5, "funcdef") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2077 && validate_name(CHILD(tree, 0), "def") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2078 && validate_ntype(CHILD(tree, 1), NAME) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2079 && validate_colon(CHILD(tree, 3)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2080 && validate_parameters(CHILD(tree, 2)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2081 && validate_suite(CHILD(tree, 4))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2082 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2083 } /* validate_funcdef() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2084 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2085 |
| 4084 | 2086 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2087 validate_lambdef(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2088 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2089 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2090 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2091 int res = (validate_ntype(tree, lambdef) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2092 && ((nch == 3) || (nch == 4)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2093 && validate_name(CHILD(tree, 0), "lambda") |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2094 && validate_colon(CHILD(tree, nch - 2)) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2095 && validate_test(CHILD(tree, nch - 1))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2096 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2097 if (res && (nch == 4)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2098 res = validate_varargslist(CHILD(tree, 1)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2099 else if (!res && !PyErr_Occurred()) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2100 validate_numnodes(tree, 3, "lambdef"); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2101 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2102 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2103 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2104 } /* validate_lambdef() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2105 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2106 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2107 /* arglist: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2108 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2109 * argument (',' argument)* [','] |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2110 */ |
| 4084 | 2111 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2112 validate_arglist(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2113 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2114 { |
| 4084 | 2115 return (validate_repeating_list(tree, arglist, |
| 2116 validate_argument, "arglist")); | |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2117 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2118 } /* validate_arglist() */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2119 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2120 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2121 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2122 /* argument: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2123 * |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2124 * [test '='] test |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2125 */ |
| 4084 | 2126 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2127 validate_argument(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2128 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2129 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2130 int nch = NCH(tree); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2131 int res = (validate_ntype(tree, argument) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2132 && ((nch == 1) || (nch == 3)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2133 && validate_test(CHILD(tree, 0))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2134 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2135 if (res && (nch == 3)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2136 res = (validate_equal(CHILD(tree, 1)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2137 && validate_test(CHILD(tree, 2))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2138 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2139 return (res); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2140 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2141 } /* validate_argument() */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2142 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2143 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2144 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2145 /* trailer: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2146 * |
| 4084 | 2147 * '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2148 */ |
| 4084 | 2149 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2150 validate_trailer(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2151 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2152 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2153 int nch = NCH(tree); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2154 int res = validate_ntype(tree, trailer) && ((nch == 2) || (nch == 3)); |
|
1406
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2155 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2156 if (res) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2157 switch (TYPE(CHILD(tree, 0))) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2158 case LPAR: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2159 res = validate_rparen(CHILD(tree, nch - 1)); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2160 if (res && (nch == 3)) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2161 res = validate_arglist(CHILD(tree, 1)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2162 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2163 case LSQB: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2164 res = (validate_numnodes(tree, 3, "trailer") |
| 4084 | 2165 && validate_subscriptlist(CHILD(tree, 1)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2166 && validate_ntype(CHILD(tree, 2), RSQB)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2167 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2168 case DOT: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2169 res = (validate_numnodes(tree, 2, "trailer") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2170 && validate_ntype(CHILD(tree, 1), NAME)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2171 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2172 default: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2173 res = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2174 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2175 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2176 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2177 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2178 validate_numnodes(tree, 2, "trailer"); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2179 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2180 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2181 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2182 } /* validate_trailer() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2183 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2184 |
| 4084 | 2185 /* subscriptlist: |
| 2186 * | |
| 2187 * subscript (',' subscript)* [','] | |
| 2188 */ | |
| 2189 static int | |
| 2190 validate_subscriptlist(tree) | |
| 2191 node *tree; | |
| 2192 { | |
| 2193 return (validate_repeating_list(tree, subscriptlist, | |
| 2194 validate_subscript, "subscriptlist")); | |
| 2195 | |
| 2196 } /* validate_subscriptlist() */ | |
| 2197 | |
| 2198 | |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2199 /* subscript: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2200 * |
| 4084 | 2201 * '.' '.' '.' | test | [test] ':' [test] [sliceop] |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2202 */ |
| 4084 | 2203 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2204 validate_subscript(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2205 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2206 { |
| 4084 | 2207 int offset = 0; |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2208 int nch = NCH(tree); |
| 4084 | 2209 int res = validate_ntype(tree, subscript) && (nch >= 1) && (nch <= 4); |
| 2210 | |
| 2211 if (!res) { | |
| 2212 if (!PyErr_Occurred()) | |
| 2213 err_string("invalid number of arguments for subscript node"); | |
| 2214 return (0); | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2215 } |
| 4084 | 2216 if (TYPE(CHILD(tree, 0)) == DOT) |
| 2217 /* take care of ('.' '.' '.') possibility */ | |
| 2218 return (validate_numnodes(tree, 3, "subscript") | |
| 2219 && validate_dot(CHILD(tree, 0)) | |
| 2220 && validate_dot(CHILD(tree, 1)) | |
| 2221 && validate_dot(CHILD(tree, 2))); | |
| 2222 if (nch == 1) { | |
| 2223 if (TYPE(CHILD(tree, 0)) == test) | |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2224 res = validate_test(CHILD(tree, 0)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2225 else |
| 4084 | 2226 res = validate_colon(CHILD(tree, 0)); |
| 2227 return (res); | |
| 2228 } | |
| 2229 /* Must be [test] ':' [test] [sliceop], | |
| 2230 * but at least one of the optional components will | |
| 2231 * be present, but we don't know which yet. | |
| 2232 */ | |
| 2233 if ((TYPE(CHILD(tree, 0)) != COLON) || (nch == 4)) { | |
| 2234 res = validate_test(CHILD(tree, 0)); | |
| 2235 offset = 1; | |
| 2236 } | |
| 2237 if (res) | |
| 2238 res = validate_colon(CHILD(tree, offset)); | |
| 2239 if (res) { | |
| 2240 int rem = nch - ++offset; | |
| 2241 if (rem) { | |
| 2242 if (TYPE(CHILD(tree, offset)) == test) { | |
| 2243 res = validate_test(CHILD(tree, offset)); | |
| 2244 ++offset; | |
| 2245 --rem; | |
| 2246 } | |
| 2247 if (res && rem) | |
| 2248 res = validate_sliceop(CHILD(tree, offset)); | |
| 2249 } | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2250 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2251 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2252 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2253 } /* validate_subscript() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2254 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2255 |
| 4084 | 2256 static int |
| 2257 validate_sliceop(tree) | |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2258 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2259 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2260 int nch = NCH(tree); |
| 4084 | 2261 int res = ((nch == 1) || validate_numnodes(tree, 2, "sliceop")) |
| 2262 && validate_ntype(tree, sliceop); | |
| 2263 if (!res && !PyErr_Occurred()) { | |
| 2264 validate_numnodes(tree, 1, "sliceop"); | |
| 2265 res = 0; | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2266 } |
| 4084 | 2267 if (res) |
| 2268 res = validate_colon(CHILD(tree, 0)); | |
| 2269 if (res && (nch == 2)) | |
| 2270 res = validate_test(CHILD(tree, 1)); | |
| 2271 | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2272 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2273 |
| 4084 | 2274 } /* validate_sliceop() */ |
| 2275 | |
| 2276 | |
| 2277 static int | |
| 2278 validate_exprlist(tree) | |
| 2279 node *tree; | |
| 2280 { | |
| 2281 return (validate_repeating_list(tree, exprlist, | |
| 2282 validate_expr, "exprlist")); | |
| 2283 | |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2284 } /* validate_exprlist() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2285 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2286 |
| 4084 | 2287 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2288 validate_dictmaker(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2289 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2290 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2291 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2292 int res = (validate_ntype(tree, dictmaker) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2293 && (nch >= 3) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2294 && validate_test(CHILD(tree, 0)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2295 && validate_colon(CHILD(tree, 1)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2296 && validate_test(CHILD(tree, 2))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2297 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2298 if (res && ((nch % 4) == 0)) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2299 res = validate_comma(CHILD(tree, --nch)); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2300 else if (res) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2301 res = ((nch % 4) == 3); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2302 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2303 if (res && (nch > 3)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2304 int pos = 3; |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2305 /* ( ',' test ':' test )* */ |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2306 while (res && (pos < nch)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2307 res = (validate_comma(CHILD(tree, pos)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2308 && validate_test(CHILD(tree, pos + 1)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2309 && validate_colon(CHILD(tree, pos + 2)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2310 && validate_test(CHILD(tree, pos + 3))); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2311 pos += 4; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2312 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2313 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2314 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2315 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2316 } /* validate_dictmaker() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2317 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2318 |
| 4084 | 2319 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2320 validate_eval_input(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2321 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2322 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2323 int pos; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2324 int nch = NCH(tree); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2325 int res = (validate_ntype(tree, eval_input) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2326 && (nch >= 2) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2327 && validate_testlist(CHILD(tree, 0)) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2328 && validate_ntype(CHILD(tree, nch - 1), ENDMARKER)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2329 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2330 for (pos = 1; res && (pos < (nch - 1)); ++pos) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2331 res = validate_ntype(CHILD(tree, pos), NEWLINE); |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2332 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2333 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2334 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2335 } /* validate_eval_input() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2336 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2337 |
| 4084 | 2338 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2339 validate_node(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2340 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2341 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2342 int nch = 0; /* num. children on current node */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2343 int res = 1; /* result value */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2344 node* next = 0; /* node to process after this one */ |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2345 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2346 while (res & (tree != 0)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2347 nch = NCH(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2348 next = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2349 switch (TYPE(tree)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2350 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2351 * Definition nodes. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2352 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2353 case funcdef: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2354 res = validate_funcdef(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2355 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2356 case classdef: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2357 res = validate_class(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2358 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2359 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2360 * "Trivial" parse tree nodes. |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2361 * (Why did I call these trivial?) |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2362 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2363 case stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2364 res = validate_stmt(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2365 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2366 case small_stmt: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2367 /* |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2368 * expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt |
| 4084 | 2369 * | import_stmt | global_stmt | exec_stmt |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2370 */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2371 res = validate_small_stmt(tree); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2372 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2373 case flow_stmt: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2374 res = (validate_numnodes(tree, 1, "flow_stmt") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2375 && ((TYPE(CHILD(tree, 0)) == break_stmt) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2376 || (TYPE(CHILD(tree, 0)) == continue_stmt) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2377 || (TYPE(CHILD(tree, 0)) == return_stmt) |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2378 || (TYPE(CHILD(tree, 0)) == raise_stmt))); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2379 if (res) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2380 next = CHILD(tree, 0); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2381 else if (nch == 1) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2382 err_string("Illegal flow_stmt type."); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2383 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2384 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2385 * Compound statements. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2386 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2387 case simple_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2388 res = validate_simple_stmt(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2389 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2390 case compound_stmt: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2391 res = validate_compound_stmt(tree); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2392 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2393 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2394 * Fundemental statements. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2395 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2396 case expr_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2397 res = validate_expr_stmt(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2398 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2399 case print_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2400 res = validate_print_stmt(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2401 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2402 case del_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2403 res = validate_del_stmt(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2404 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2405 case pass_stmt: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2406 res = (validate_numnodes(tree, 1, "pass") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2407 && validate_name(CHILD(tree, 0), "pass")); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2408 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2409 case break_stmt: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2410 res = (validate_numnodes(tree, 1, "break") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2411 && validate_name(CHILD(tree, 0), "break")); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2412 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2413 case continue_stmt: |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2414 res = (validate_numnodes(tree, 1, "continue") |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2415 && validate_name(CHILD(tree, 0), "continue")); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2416 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2417 case return_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2418 res = validate_return_stmt(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2419 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2420 case raise_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2421 res = validate_raise_stmt(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2422 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2423 case import_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2424 res = validate_import_stmt(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2425 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2426 case global_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2427 res = validate_global_stmt(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2428 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2429 case exec_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2430 res = validate_exec_stmt(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2431 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2432 case if_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2433 res = validate_if(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2434 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2435 case while_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2436 res = validate_while(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2437 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2438 case for_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2439 res = validate_for(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2440 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2441 case try_stmt: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2442 res = validate_try(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2443 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2444 case suite: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2445 res = validate_suite(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2446 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2447 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2448 * Expression nodes. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2449 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2450 case testlist: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2451 res = validate_testlist(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2452 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2453 case test: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2454 res = validate_test(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2455 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2456 case and_test: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2457 res = validate_and_test(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2458 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2459 case not_test: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2460 res = validate_not_test(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2461 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2462 case comparison: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2463 res = validate_comparison(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2464 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2465 case exprlist: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2466 res = validate_exprlist(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2467 break; |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2468 case comp_op: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2469 res = validate_comp_op(tree); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2470 break; |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2471 case expr: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2472 res = validate_expr(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2473 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2474 case xor_expr: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2475 res = validate_xor_expr(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2476 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2477 case and_expr: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2478 res = validate_and_expr(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2479 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2480 case shift_expr: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2481 res = validate_shift_expr(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2482 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2483 case arith_expr: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2484 res = validate_arith_expr(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2485 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2486 case term: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2487 res = validate_term(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2488 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2489 case factor: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2490 res = validate_factor(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2491 break; |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2492 case power: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2493 res = validate_power(tree); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2494 break; |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2495 case atom: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2496 res = validate_atom(tree); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2497 break; |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2498 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2499 default: |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2500 /* Hopefully never reached! */ |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2501 err_string("Unrecogniged node type."); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2502 res = 0; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2503 break; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2504 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2505 tree = next; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2506 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2507 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2508 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2509 } /* validate_node() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2510 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2511 |
| 4084 | 2512 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2513 validate_expr_tree(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2514 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2515 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2516 int res = validate_eval_input(tree); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2517 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2518 if (!res && !PyErr_Occurred()) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2519 err_string("Could not validate expression tuple."); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2520 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2521 return (res); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2522 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2523 } /* validate_expr_tree() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2524 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2525 |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2526 /* file_input: |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2527 * (NEWLINE | stmt)* ENDMARKER |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2528 */ |
| 4084 | 2529 static int |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2530 validate_file_input(tree) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2531 node *tree; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2532 { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2533 int j = 0; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2534 int nch = NCH(tree) - 1; |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2535 int res = ((nch >= 0) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2536 && validate_ntype(CHILD(tree, nch), ENDMARKER)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2537 |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2538 for ( ; res && (j < nch); ++j) { |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2539 if (TYPE(CHILD(tree, j)) == stmt) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2540 res = validate_stmt(CHILD(tree, j)); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2541 else |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2542 res = validate_newline(CHILD(tree, j)); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2543 } |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2544 /* This stays in to prevent any internal failues from getting to the |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2545 * user. Hopefully, this won't be needed. If a user reports getting |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2546 * this, we have some debugging to do. |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2547 */ |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2548 if (!res && !PyErr_Occurred()) |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2549 err_string("VALIDATION FAILURE: report this to the maintainer!."); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2550 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2551 return (res); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2552 |
|
4099
3a3b36716689
Patches to make it compile with K&R C
Guido van Rossum <guido@python.org>
parents:
4092
diff
changeset
|
2553 } /* validate_file_input() */ |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2554 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2555 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2556 /* Functions exported by this module. Most of this should probably |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2557 * be converted into an AST object with methods, but that is better |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2558 * done directly in Python, allowing subclasses to be created directly. |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2559 * We'd really have to write a wrapper around it all anyway to allow |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2560 * inheritance. |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2561 */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2562 static PyMethodDef parser_functions[] = { |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2563 {"ast2tuple", parser_ast2tuple, 1, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2564 "Creates a tuple-tree representation of an AST."}, |
| 4084 | 2565 {"ast2list", parser_ast2list, 1, |
| 2566 "Creates a list-tree representation of an AST."}, | |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2567 {"compileast", parser_compileast, 1, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2568 "Compiles an AST object into a code object."}, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2569 {"expr", parser_expr, 1, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2570 "Creates an AST object from an expression."}, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2571 {"isexpr", parser_isexpr, 1, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2572 "Determines if an AST object was created from an expression."}, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2573 {"issuite", parser_issuite, 1, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2574 "Determines if an AST object was created from a suite."}, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2575 {"suite", parser_suite, 1, |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2576 "Creates an AST object from a suite."}, |
| 4084 | 2577 {"sequence2ast", parser_tuple2ast, 1, |
| 2578 "Creates an AST object from a tree representation."}, | |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2579 {"tuple2ast", parser_tuple2ast, 1, |
| 4084 | 2580 "Creates an AST object from a tree representation."}, |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2581 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2582 {0, 0, 0} |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2583 }; |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2584 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2585 |
|
1406
474823e5f7dc
* parsermodule.c, Makefile, config.c: rudimentary interface to the Python
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2586 void |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2587 initparser() |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2588 { |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2589 PyObject* module = Py_InitModule("parser", parser_functions); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2590 PyObject* dict = PyModule_GetDict(module); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2591 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2592 parser_error = PyString_FromString("parser.ParserError"); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2593 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2594 if ((parser_error == 0) |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2595 || (PyDict_SetItemString(dict, "ParserError", parser_error) != 0)) { |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2596 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2597 * This is serious. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2598 */ |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2599 Py_FatalError("can't define parser.ParserError"); |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2600 } |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2601 /* |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2602 * Nice to have, but don't cry if we fail. |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2603 */ |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2604 Py_INCREF(&PyAST_Type); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2605 PyDict_SetItemString(dict, "ASTType", (PyObject*)&PyAST_Type); |
|
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2606 |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2607 PyDict_SetItemString(dict, "__copyright__", |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2608 PyString_FromString(parser_copyright_string)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2609 PyDict_SetItemString(dict, "__doc__", |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2610 PyString_FromString(parser_doc_string)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2611 PyDict_SetItemString(dict, "__version__", |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2612 PyString_FromString(parser_version_string)); |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2613 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2614 } /* initparser() */ |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2615 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2616 |
|
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2617 /* |
|
3774
4c78d73c5667
New submission by Fred Drake.
Guido van Rossum <guido@python.org>
parents:
3336
diff
changeset
|
2618 * end of parsermodule.c |
|
3200
8f5ab1a6c914
Fred Drake's new parser module
Guido van Rossum <guido@python.org>
parents:
2150
diff
changeset
|
2619 */ |
