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.
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
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.
21 * I've added some annotations that help with the lint code-checking
22 * program, but they're not complete by a long shot. The real errors
23 * that lint detects are gone, but there are still warnings with
24 * Py_[X]DECREF() and Py_[X]INCREF() macros. The lint annotations
25 * look like "NOTE(...)".
28 #include "Python.h" /* general Python API */
29 #include "Python-ast.h" /* mod_ty */
30 #include "graminit.h" /* symbols defined in the grammar */
31 #include "node.h" /* internal parser structure */
32 #include "errcode.h" /* error codes for PyNode_*() */
33 #include "token.h" /* token definitions */
36 /* ISTERMINAL() / ISNONTERMINAL() */
42 extern grammar _PyParser_Grammar
; /* From graminit.c */
50 /* String constants used to initialize module attributes.
53 static char parser_copyright_string
[] =
54 "Copyright 1995-1996 by Virginia Polytechnic Institute & State\n\
55 University, Blacksburg, Virginia, USA, and Fred L. Drake, Jr., Reston,\n\
56 Virginia, USA. Portions copyright 1991-1995 by Stichting Mathematisch\n\
57 Centrum, Amsterdam, The Netherlands.";
60 PyDoc_STRVAR(parser_doc_string
,
61 "This is an interface to Python's internal parser.");
63 static char parser_version_string
[] = "0.5";
66 typedef PyObject
* (*SeqMaker
) (Py_ssize_t length
);
67 typedef int (*SeqInserter
) (PyObject
* sequence
,
71 /* The function below is copyrighted by Stichting Mathematisch Centrum. The
72 * original copyright statement is included below, and continues to apply
73 * in full to the function immediately following. All other material is
74 * original, copyrighted by Fred L. Drake, Jr. and Virginia Polytechnic
75 * Institute and State University. Changes were made to comply with the
76 * new naming conventions. Added arguments to provide support for creating
77 * lists as well as tuples, and optionally including the line numbers.
82 node2tuple(node
*n
, /* node to convert */
83 SeqMaker mkseq
, /* create sequence */
84 SeqInserter addelem
, /* func. to add elem. in seq. */
85 int lineno
, /* include line numbers? */
86 int col_offset
) /* include column offsets? */
92 if (ISNONTERMINAL(TYPE(n
))) {
97 v
= mkseq(1 + NCH(n
) + (TYPE(n
) == encoding_decl
));
100 w
= PyInt_FromLong(TYPE(n
));
103 return ((PyObject
*) NULL
);
105 (void) addelem(v
, 0, w
);
106 for (i
= 0; i
< NCH(n
); i
++) {
107 w
= node2tuple(CHILD(n
, i
), mkseq
, addelem
, lineno
, col_offset
);
110 return ((PyObject
*) NULL
);
112 (void) addelem(v
, i
+1, w
);
115 if (TYPE(n
) == encoding_decl
)
116 (void) addelem(v
, i
+1, PyString_FromString(STR(n
)));
119 else if (ISTERMINAL(TYPE(n
))) {
120 PyObject
*result
= mkseq(2 + lineno
+ col_offset
);
121 if (result
!= NULL
) {
122 (void) addelem(result
, 0, PyInt_FromLong(TYPE(n
)));
123 (void) addelem(result
, 1, PyString_FromString(STR(n
)));
125 (void) addelem(result
, 2, PyInt_FromLong(n
->n_lineno
));
127 (void) addelem(result
, 3, PyInt_FromLong(n
->n_col_offset
));
132 PyErr_SetString(PyExc_SystemError
,
133 "unrecognized parse tree node type");
134 return ((PyObject
*) NULL
);
138 * End of material copyrighted by Stichting Mathematisch Centrum.
143 /* There are two types of intermediate objects we're interested in:
144 * 'eval' and 'exec' types. These constants can be used in the st_type
145 * field of the object type to identify which any given object represents.
146 * These should probably go in an external header to allow other extensions
147 * to use them, but then, we really should be using C++ too. ;-)
154 /* These are the internal objects and definitions required to implement the
155 * ST type. Most of the internal names are more reminiscent of the 'old'
156 * naming style, but the code uses the new naming convention.
164 PyObject_HEAD
/* standard object header */
165 node
* st_node
; /* the node* returned by the parser */
166 int st_type
; /* EXPR or SUITE ? */
167 PyCompilerFlags st_flags
; /* Parser and compiler flags */
171 static void parser_free(PyST_Object
*st
);
172 static int parser_compare(PyST_Object
*left
, PyST_Object
*right
);
173 static PyObject
*parser_getattr(PyObject
*self
, char *name
);
177 PyTypeObject PyST_Type
= {
178 PyVarObject_HEAD_INIT(NULL
, 0)
179 "parser.st", /* tp_name */
180 (int) sizeof(PyST_Object
), /* tp_basicsize */
182 (destructor
)parser_free
, /* tp_dealloc */
184 parser_getattr
, /* tp_getattr */
186 (cmpfunc
)parser_compare
, /* tp_compare */
188 0, /* tp_as_number */
189 0, /* tp_as_sequence */
190 0, /* tp_as_mapping */
197 /* Functions to access object as input/output buffer */
198 0, /* tp_as_buffer */
200 Py_TPFLAGS_DEFAULT
, /* tp_flags */
203 "Intermediate representation of a Python parse tree."
208 parser_compare_nodes(node
*left
, node
*right
)
212 if (TYPE(left
) < TYPE(right
))
215 if (TYPE(right
) < TYPE(left
))
218 if (ISTERMINAL(TYPE(left
)))
219 return (strcmp(STR(left
), STR(right
)));
221 if (NCH(left
) < NCH(right
))
224 if (NCH(right
) < NCH(left
))
227 for (j
= 0; j
< NCH(left
); ++j
) {
228 int v
= parser_compare_nodes(CHILD(left
, j
), CHILD(right
, j
));
237 /* int parser_compare(PyST_Object* left, PyST_Object* right)
239 * Comparison function used by the Python operators ==, !=, <, >, <=, >=
240 * This really just wraps a call to parser_compare_nodes() with some easy
241 * checks and protection code.
245 parser_compare(PyST_Object
*left
, PyST_Object
*right
)
250 if ((left
== 0) || (right
== 0))
253 return (parser_compare_nodes(left
->st_node
, right
->st_node
));
257 /* parser_newstobject(node* st)
259 * Allocates a new Python object representing an ST. This is simply the
260 * 'wrapper' object that holds a node* and allows it to be passed around in
265 parser_newstobject(node
*st
, int type
)
267 PyST_Object
* o
= PyObject_New(PyST_Object
, &PyST_Type
);
272 o
->st_flags
.cf_flags
= 0;
277 return ((PyObject
*)o
);
281 /* void parser_free(PyST_Object* st)
283 * This is called by a del statement that reduces the reference count to 0.
287 parser_free(PyST_Object
*st
)
289 PyNode_Free(st
->st_node
);
294 /* parser_st2tuple(PyObject* self, PyObject* args, PyObject* kw)
296 * This provides conversion from a node* to a tuple object that can be
297 * returned to the Python-level caller. The ST object is not modified.
301 parser_st2tuple(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
303 PyObject
*line_option
= 0;
304 PyObject
*col_option
= 0;
308 static char *keywords
[] = {"ast", "line_info", "col_info", NULL
};
311 ok
= PyArg_ParseTupleAndKeywords(args
, kw
, "O!|OO:st2tuple", keywords
,
312 &PyST_Type
, &self
, &line_option
,
316 ok
= PyArg_ParseTupleAndKeywords(args
, kw
, "|OO:totuple", &keywords
[1],
317 &line_option
, &col_option
);
321 if (line_option
!= NULL
) {
322 lineno
= (PyObject_IsTrue(line_option
) != 0) ? 1 : 0;
324 if (col_option
!= NULL
) {
325 col_offset
= (PyObject_IsTrue(col_option
) != 0) ? 1 : 0;
328 * Convert ST into a tuple representation. Use Guido's function,
329 * since it's known to work already.
331 res
= node2tuple(((PyST_Object
*)self
)->st_node
,
332 PyTuple_New
, PyTuple_SetItem
, lineno
, col_offset
);
338 parser_ast2tuple(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
340 if (PyErr_WarnPy3k("ast2tuple is removed in 3.x; use st2tuple", 1) < 0)
342 return parser_st2tuple(self
, args
, kw
);
346 /* parser_st2list(PyObject* self, PyObject* args, PyObject* kw)
348 * This provides conversion from a node* to a list object that can be
349 * returned to the Python-level caller. The ST object is not modified.
353 parser_st2list(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
355 PyObject
*line_option
= 0;
356 PyObject
*col_option
= 0;
360 static char *keywords
[] = {"ast", "line_info", "col_info", NULL
};
363 ok
= PyArg_ParseTupleAndKeywords(args
, kw
, "O!|OO:st2list", keywords
,
364 &PyST_Type
, &self
, &line_option
,
367 ok
= PyArg_ParseTupleAndKeywords(args
, kw
, "|OO:tolist", &keywords
[1],
368 &line_option
, &col_option
);
372 if (line_option
!= 0) {
373 lineno
= PyObject_IsTrue(line_option
) ? 1 : 0;
375 if (col_option
!= NULL
) {
376 col_offset
= (PyObject_IsTrue(col_option
) != 0) ? 1 : 0;
379 * Convert ST into a tuple representation. Use Guido's function,
380 * since it's known to work already.
382 res
= node2tuple(self
->st_node
,
383 PyList_New
, PyList_SetItem
, lineno
, col_offset
);
389 parser_ast2list(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
391 if (PyErr_WarnPy3k("ast2list is removed in 3.x; use st2list", 1) < 0)
393 return parser_st2list(self
, args
, kw
);
397 /* parser_compilest(PyObject* self, PyObject* args)
399 * This function creates code objects from the parse tree represented by
400 * the passed-in data object. An optional file name is passed in as well.
404 parser_compilest(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
409 char* str
= "<syntax-tree>";
412 static char *keywords
[] = {"ast", "filename", NULL
};
415 ok
= PyArg_ParseTupleAndKeywords(args
, kw
, "O!|s:compilest", keywords
,
416 &PyST_Type
, &self
, &str
);
418 ok
= PyArg_ParseTupleAndKeywords(args
, kw
, "|s:compile", &keywords
[1],
422 arena
= PyArena_New();
424 mod
= PyAST_FromNode(self
->st_node
, &(self
->st_flags
), str
, arena
);
426 res
= (PyObject
*)PyAST_Compile(mod
, str
, &(self
->st_flags
), arena
);
436 parser_compileast(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
438 if (PyErr_WarnPy3k("compileast is removed in 3.x; use compilest", 1) < 0)
440 return parser_compilest(self
, args
, kw
);
444 /* PyObject* parser_isexpr(PyObject* self, PyObject* args)
445 * PyObject* parser_issuite(PyObject* self, PyObject* args)
447 * Checks the passed-in ST object to determine if it is an expression or
448 * a statement suite, respectively. The return is a Python truth value.
452 parser_isexpr(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
457 static char *keywords
[] = {"ast", NULL
};
460 ok
= PyArg_ParseTupleAndKeywords(args
, kw
, "O!:isexpr", keywords
,
463 ok
= PyArg_ParseTupleAndKeywords(args
, kw
, ":isexpr", &keywords
[1]);
466 /* Check to see if the ST represents an expression or not. */
467 res
= (self
->st_type
== PyST_EXPR
) ? Py_True
: Py_False
;
475 parser_issuite(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
480 static char *keywords
[] = {"ast", NULL
};
483 ok
= PyArg_ParseTupleAndKeywords(args
, kw
, "O!:issuite", keywords
,
486 ok
= PyArg_ParseTupleAndKeywords(args
, kw
, ":issuite", &keywords
[1]);
489 /* Check to see if the ST represents an expression or not. */
490 res
= (self
->st_type
== PyST_EXPR
) ? Py_False
: Py_True
;
497 #define PUBLIC_METHOD_TYPE (METH_VARARGS|METH_KEYWORDS)
501 {"compile", (PyCFunction
)parser_compilest
, PUBLIC_METHOD_TYPE
,
502 PyDoc_STR("Compile this ST object into a code object.")},
503 {"isexpr", (PyCFunction
)parser_isexpr
, PUBLIC_METHOD_TYPE
,
504 PyDoc_STR("Determines if this ST object was created from an expression.")},
505 {"issuite", (PyCFunction
)parser_issuite
, PUBLIC_METHOD_TYPE
,
506 PyDoc_STR("Determines if this ST object was created from a suite.")},
507 {"tolist", (PyCFunction
)parser_st2list
, PUBLIC_METHOD_TYPE
,
508 PyDoc_STR("Creates a list-tree representation of this ST.")},
509 {"totuple", (PyCFunction
)parser_st2tuple
, PUBLIC_METHOD_TYPE
,
510 PyDoc_STR("Creates a tuple-tree representation of this ST.")},
512 {NULL
, NULL
, 0, NULL
}
517 parser_getattr(PyObject
*self
, char *name
)
519 return (Py_FindMethod(parser_methods
, self
, name
));
523 /* err_string(char* message)
525 * Sets the error string for an exception of type ParserError.
529 err_string(char *message
)
531 PyErr_SetString(parser_error
, message
);
535 /* PyObject* parser_do_parse(PyObject* args, int type)
537 * Internal function to actually execute the parse and return the result if
538 * successful or set an exception if not.
542 parser_do_parse(PyObject
*args
, PyObject
*kw
, char *argspec
, int type
)
549 static char *keywords
[] = {"source", NULL
};
551 if (PyArg_ParseTupleAndKeywords(args
, kw
, argspec
, keywords
, &string
)) {
552 node
* n
= PyParser_ParseStringFlagsFilenameEx(string
, NULL
,
555 ? eval_input
: file_input
,
559 res
= parser_newstobject(n
, type
);
561 ((PyST_Object
*)res
)->st_flags
.cf_flags
= flags
& PyCF_MASK
;
564 PyParser_SetError(&err
);
570 /* PyObject* parser_expr(PyObject* self, PyObject* args)
571 * PyObject* parser_suite(PyObject* self, PyObject* args)
573 * External interfaces to the parser itself. Which is called determines if
574 * the parser attempts to recognize an expression ('eval' form) or statement
575 * suite ('exec' form). The real work is done by parser_do_parse() above.
579 parser_expr(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
581 NOTE(ARGUNUSED(self
))
582 return (parser_do_parse(args
, kw
, "s:expr", PyST_EXPR
));
587 parser_suite(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
589 NOTE(ARGUNUSED(self
))
590 return (parser_do_parse(args
, kw
, "s:suite", PyST_SUITE
));
595 /* This is the messy part of the code. Conversion from a tuple to an ST
596 * object requires that the input tuple be valid without having to rely on
597 * catching an exception from the compiler. This is done to allow the
598 * compiler itself to remain fast, since most of its input will come from
599 * the parser directly, and therefore be known to be syntactically correct.
600 * This validation is done to ensure that we don't core dump the compile
601 * phase, returning an exception instead.
603 * Two aspects can be broken out in this code: creating a node tree from
604 * the tuple passed in, and verifying that it is indeed valid. It may be
605 * advantageous to expand the number of ST types to include funcdefs and
606 * lambdadefs to take advantage of the optimizer, recognizing those STs
607 * here. They are not necessary, and not quite as useful in a raw form.
608 * For now, let's get expressions and suites working reliably.
612 static node
* build_node_tree(PyObject
*tuple
);
613 static int validate_expr_tree(node
*tree
);
614 static int validate_file_input(node
*tree
);
615 static int validate_encoding_decl(node
*tree
);
617 /* PyObject* parser_tuple2st(PyObject* self, PyObject* args)
619 * This is the public function, called from the Python code. It receives a
620 * single tuple object from the caller, and creates an ST object if the
621 * tuple can be validated. It does this by checking the first code of the
622 * tuple, and, if acceptable, builds the internal representation. If this
623 * step succeeds, the internal representation is validated as fully as
624 * possible with the various validate_*() routines defined below.
626 * This function must be changed if support is to be added for PyST_FRAGMENT
631 parser_tuple2st(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
633 NOTE(ARGUNUSED(self
))
638 static char *keywords
[] = {"sequence", NULL
};
640 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "O:sequence2st", keywords
,
643 if (!PySequence_Check(tuple
)) {
644 PyErr_SetString(PyExc_ValueError
,
645 "sequence2st() requires a single sequence argument");
649 * Convert the tree to the internal form before checking it.
651 tree
= build_node_tree(tuple
);
653 int start_sym
= TYPE(tree
);
654 if (start_sym
== eval_input
) {
655 /* Might be an eval form. */
656 if (validate_expr_tree(tree
))
657 st
= parser_newstobject(tree
, PyST_EXPR
);
661 else if (start_sym
== file_input
) {
662 /* This looks like an exec form so far. */
663 if (validate_file_input(tree
))
664 st
= parser_newstobject(tree
, PyST_SUITE
);
668 else if (start_sym
== encoding_decl
) {
669 /* This looks like an encoding_decl so far. */
670 if (validate_encoding_decl(tree
))
671 st
= parser_newstobject(tree
, PyST_SUITE
);
676 /* This is a fragment, at best. */
678 err_string("parse tree does not use a valid start symbol");
681 /* Make sure we throw an exception on all errors. We should never
682 * get this, but we'd do well to be sure something is done.
684 if (st
== NULL
&& !PyErr_Occurred())
685 err_string("unspecified ST error occurred");
691 parser_tuple2ast(PyST_Object
*self
, PyObject
*args
, PyObject
*kw
)
693 if (PyErr_WarnPy3k("tuple2ast is removed in 3.x; use tuple2st", 1) < 0)
695 return parser_tuple2st(self
, args
, kw
);
699 /* node* build_node_children()
701 * Iterate across the children of the current non-terminal node and build
702 * their structures. If successful, return the root of this portion of
703 * the tree, otherwise, 0. Any required exception will be specified already,
704 * and no memory will have been deallocated.
708 build_node_children(PyObject
*tuple
, node
*root
, int *line_num
)
710 Py_ssize_t len
= PyObject_Size(tuple
);
714 for (i
= 1; i
< len
; ++i
) {
715 /* elem must always be a sequence, however simple */
716 PyObject
* elem
= PySequence_GetItem(tuple
, i
);
717 int ok
= elem
!= NULL
;
722 ok
= PySequence_Check(elem
);
724 PyObject
*temp
= PySequence_GetItem(elem
, 0);
728 ok
= PyInt_Check(temp
);
730 type
= PyInt_AS_LONG(temp
);
735 PyObject
*err
= Py_BuildValue("os", elem
,
736 "Illegal node construct.");
737 PyErr_SetObject(parser_error
, err
);
742 if (ISTERMINAL(type
)) {
743 Py_ssize_t len
= PyObject_Size(elem
);
746 if ((len
!= 2) && (len
!= 3)) {
747 err_string("terminal nodes must have 2 or 3 entries");
750 temp
= PySequence_GetItem(elem
, 1);
753 if (!PyString_Check(temp
)) {
754 PyErr_Format(parser_error
,
755 "second item in terminal node must be a string,"
757 Py_TYPE(temp
)->tp_name
);
762 PyObject
*o
= PySequence_GetItem(elem
, 2);
765 *line_num
= PyInt_AS_LONG(o
);
767 PyErr_Format(parser_error
,
768 "third item in terminal node must be an"
769 " integer, found %s",
770 Py_TYPE(temp
)->tp_name
);
778 len
= PyString_GET_SIZE(temp
) + 1;
779 strn
= (char *)PyObject_MALLOC(len
);
781 (void) memcpy(strn
, PyString_AS_STRING(temp
), len
);
784 else if (!ISNONTERMINAL(type
)) {
786 * It has to be one or the other; this is an error.
787 * Throw an exception.
789 PyObject
*err
= Py_BuildValue("os", elem
, "unknown node type.");
790 PyErr_SetObject(parser_error
, err
);
795 err
= PyNode_AddChild(root
, type
, strn
, *line_num
, 0);
796 if (err
== E_NOMEM
) {
798 return (node
*) PyErr_NoMemory();
800 if (err
== E_OVERFLOW
) {
802 PyErr_SetString(PyExc_ValueError
,
803 "unsupported number of child nodes");
807 if (ISNONTERMINAL(type
)) {
808 node
* new_child
= CHILD(root
, i
- 1);
810 if (new_child
!= build_node_children(elem
, new_child
, line_num
)) {
815 else if (type
== NEWLINE
) { /* It's true: we increment the */
816 ++(*line_num
); /* line number *after* the newline! */
825 build_node_tree(PyObject
*tuple
)
828 PyObject
*temp
= PySequence_GetItem(tuple
, 0);
832 num
= PyInt_AsLong(temp
);
834 if (ISTERMINAL(num
)) {
836 * The tuple is simple, but it doesn't start with a start symbol.
837 * Throw an exception now and be done with it.
839 tuple
= Py_BuildValue("os", tuple
,
840 "Illegal syntax-tree; cannot start with terminal symbol.");
841 PyErr_SetObject(parser_error
, tuple
);
844 else if (ISNONTERMINAL(num
)) {
846 * Not efficient, but that can be handled later.
849 PyObject
*encoding
= NULL
;
851 if (num
== encoding_decl
) {
852 encoding
= PySequence_GetItem(tuple
, 2);
853 /* tuple isn't borrowed anymore here, need to DECREF */
854 tuple
= PySequence_GetSlice(tuple
, 0, 2);
856 res
= PyNode_New(num
);
858 if (res
!= build_node_children(tuple
, res
, &line_num
)) {
862 if (res
&& encoding
) {
864 len
= PyString_GET_SIZE(encoding
) + 1;
865 res
->n_str
= (char *)PyObject_MALLOC(len
);
866 if (res
->n_str
!= NULL
)
867 (void) memcpy(res
->n_str
, PyString_AS_STRING(encoding
), len
);
874 /* The tuple is illegal -- if the number is neither TERMINAL nor
875 * NONTERMINAL, we can't use it. Not sure the implementation
876 * allows this condition, but the API doesn't preclude it.
878 PyObject
*err
= Py_BuildValue("os", tuple
,
879 "Illegal component tuple.");
880 PyErr_SetObject(parser_error
, err
);
889 * Validation routines used within the validation section:
891 static int validate_terminal(node
*terminal
, int type
, char *string
);
893 #define validate_ampersand(ch) validate_terminal(ch, AMPER, "&")
894 #define validate_circumflex(ch) validate_terminal(ch, CIRCUMFLEX, "^")
895 #define validate_colon(ch) validate_terminal(ch, COLON, ":")
896 #define validate_comma(ch) validate_terminal(ch, COMMA, ",")
897 #define validate_dedent(ch) validate_terminal(ch, DEDENT, "")
898 #define validate_equal(ch) validate_terminal(ch, EQUAL, "=")
899 #define validate_indent(ch) validate_terminal(ch, INDENT, (char*)NULL)
900 #define validate_lparen(ch) validate_terminal(ch, LPAR, "(")
901 #define validate_newline(ch) validate_terminal(ch, NEWLINE, (char*)NULL)
902 #define validate_rparen(ch) validate_terminal(ch, RPAR, ")")
903 #define validate_semi(ch) validate_terminal(ch, SEMI, ";")
904 #define validate_star(ch) validate_terminal(ch, STAR, "*")
905 #define validate_vbar(ch) validate_terminal(ch, VBAR, "|")
906 #define validate_doublestar(ch) validate_terminal(ch, DOUBLESTAR, "**")
907 #define validate_dot(ch) validate_terminal(ch, DOT, ".")
908 #define validate_at(ch) validate_terminal(ch, AT, "@")
909 #define validate_name(ch, str) validate_terminal(ch, NAME, str)
911 #define VALIDATER(n) static int validate_##n(node *tree)
913 VALIDATER(node
); VALIDATER(small_stmt
);
914 VALIDATER(class); VALIDATER(node
);
915 VALIDATER(parameters
); VALIDATER(suite
);
916 VALIDATER(testlist
); VALIDATER(varargslist
);
917 VALIDATER(fpdef
); VALIDATER(fplist
);
918 VALIDATER(stmt
); VALIDATER(simple_stmt
);
919 VALIDATER(expr_stmt
); VALIDATER(power
);
920 VALIDATER(print_stmt
); VALIDATER(del_stmt
);
921 VALIDATER(return_stmt
); VALIDATER(list_iter
);
922 VALIDATER(raise_stmt
); VALIDATER(import_stmt
);
923 VALIDATER(import_name
); VALIDATER(import_from
);
924 VALIDATER(global_stmt
); VALIDATER(list_if
);
925 VALIDATER(assert_stmt
); VALIDATER(list_for
);
926 VALIDATER(exec_stmt
); VALIDATER(compound_stmt
);
927 VALIDATER(while); VALIDATER(for);
928 VALIDATER(try); VALIDATER(except_clause
);
929 VALIDATER(test
); VALIDATER(and_test
);
930 VALIDATER(not_test
); VALIDATER(comparison
);
931 VALIDATER(comp_op
); VALIDATER(expr
);
932 VALIDATER(xor_expr
); VALIDATER(and_expr
);
933 VALIDATER(shift_expr
); VALIDATER(arith_expr
);
934 VALIDATER(term
); VALIDATER(factor
);
935 VALIDATER(atom
); VALIDATER(lambdef
);
936 VALIDATER(trailer
); VALIDATER(subscript
);
937 VALIDATER(subscriptlist
); VALIDATER(sliceop
);
938 VALIDATER(exprlist
); VALIDATER(dictmaker
);
939 VALIDATER(arglist
); VALIDATER(argument
);
940 VALIDATER(listmaker
); VALIDATER(yield_stmt
);
941 VALIDATER(testlist1
); VALIDATER(gen_for
);
942 VALIDATER(gen_iter
); VALIDATER(gen_if
);
943 VALIDATER(testlist_gexp
); VALIDATER(yield_expr
);
944 VALIDATER(yield_or_testlist
); VALIDATER(or_test
);
945 VALIDATER(old_test
); VALIDATER(old_lambdef
);
949 #define is_even(n) (((n) & 1) == 0)
950 #define is_odd(n) (((n) & 1) == 1)
954 validate_ntype(node
*n
, int t
)
957 PyErr_Format(parser_error
, "Expected node type %d, got %d.",
965 /* Verifies that the number of child nodes is exactly 'num', raising
966 * an exception if it isn't. The exception message does not indicate
967 * the exact number of nodes, allowing this to be used to raise the
968 * "right" exception when the wrong number of nodes is present in a
969 * specific variant of a statement's syntax. This is commonly used
973 validate_numnodes(node
*n
, int num
, const char *const name
)
976 PyErr_Format(parser_error
,
977 "Illegal number of children for %s node.", name
);
985 validate_terminal(node
*terminal
, int type
, char *string
)
987 int res
= (validate_ntype(terminal
, type
)
988 && ((string
== 0) || (strcmp(string
, STR(terminal
)) == 0)));
990 if (!res
&& !PyErr_Occurred()) {
991 PyErr_Format(parser_error
,
992 "Illegal terminal: expected \"%s\"", string
);
1001 validate_repeating_list(node
*tree
, int ntype
, int (*vfunc
)(node
*),
1002 const char *const name
)
1004 int nch
= NCH(tree
);
1005 int res
= (nch
&& validate_ntype(tree
, ntype
)
1006 && vfunc(CHILD(tree
, 0)));
1008 if (!res
&& !PyErr_Occurred())
1009 (void) validate_numnodes(tree
, 1, name
);
1012 res
= validate_comma(CHILD(tree
, --nch
));
1013 if (res
&& nch
> 1) {
1015 for ( ; res
&& pos
< nch
; pos
+= 2)
1016 res
= (validate_comma(CHILD(tree
, pos
))
1017 && vfunc(CHILD(tree
, pos
+ 1)));
1027 * 'class' NAME ['(' testlist ')'] ':' suite
1030 validate_class(node
*tree
)
1032 int nch
= NCH(tree
);
1033 int res
= (validate_ntype(tree
, classdef
) &&
1034 ((nch
== 4) || (nch
== 6) || (nch
== 7)));
1037 res
= (validate_name(CHILD(tree
, 0), "class")
1038 && validate_ntype(CHILD(tree
, 1), NAME
)
1039 && validate_colon(CHILD(tree
, nch
- 2))
1040 && validate_suite(CHILD(tree
, nch
- 1)));
1043 (void) validate_numnodes(tree
, 4, "class");
1048 res
= ((validate_lparen(CHILD(tree
, 2)) &&
1049 validate_testlist(CHILD(tree
, 3)) &&
1050 validate_rparen(CHILD(tree
, 4))));
1052 else if (nch
== 6) {
1053 res
= (validate_lparen(CHILD(tree
,2)) &&
1054 validate_rparen(CHILD(tree
,3)));
1062 * 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
1065 validate_if(node
*tree
)
1067 int nch
= NCH(tree
);
1068 int res
= (validate_ntype(tree
, if_stmt
)
1070 && validate_name(CHILD(tree
, 0), "if")
1071 && validate_test(CHILD(tree
, 1))
1072 && validate_colon(CHILD(tree
, 2))
1073 && validate_suite(CHILD(tree
, 3)));
1075 if (res
&& ((nch
% 4) == 3)) {
1076 /* ... 'else' ':' suite */
1077 res
= (validate_name(CHILD(tree
, nch
- 3), "else")
1078 && validate_colon(CHILD(tree
, nch
- 2))
1079 && validate_suite(CHILD(tree
, nch
- 1)));
1082 else if (!res
&& !PyErr_Occurred())
1083 (void) validate_numnodes(tree
, 4, "if");
1085 /* Will catch the case for nch < 4 */
1086 res
= validate_numnodes(tree
, 0, "if");
1087 else if (res
&& (nch
> 4)) {
1088 /* ... ('elif' test ':' suite)+ ... */
1090 while ((j
< nch
) && res
) {
1091 res
= (validate_name(CHILD(tree
, j
), "elif")
1092 && validate_colon(CHILD(tree
, j
+ 2))
1093 && validate_test(CHILD(tree
, j
+ 1))
1094 && validate_suite(CHILD(tree
, j
+ 3)));
1103 * '(' [varargslist] ')'
1107 validate_parameters(node
*tree
)
1109 int nch
= NCH(tree
);
1110 int res
= validate_ntype(tree
, parameters
) && ((nch
== 2) || (nch
== 3));
1113 res
= (validate_lparen(CHILD(tree
, 0))
1114 && validate_rparen(CHILD(tree
, nch
- 1)));
1115 if (res
&& (nch
== 3))
1116 res
= validate_varargslist(CHILD(tree
, 1));
1119 (void) validate_numnodes(tree
, 2, "parameters");
1129 * | NEWLINE INDENT stmt+ DEDENT
1132 validate_suite(node
*tree
)
1134 int nch
= NCH(tree
);
1135 int res
= (validate_ntype(tree
, suite
) && ((nch
== 1) || (nch
>= 4)));
1137 if (res
&& (nch
== 1))
1138 res
= validate_simple_stmt(CHILD(tree
, 0));
1140 /* NEWLINE INDENT stmt+ DEDENT */
1141 res
= (validate_newline(CHILD(tree
, 0))
1142 && validate_indent(CHILD(tree
, 1))
1143 && validate_stmt(CHILD(tree
, 2))
1144 && validate_dedent(CHILD(tree
, nch
- 1)));
1146 if (res
&& (nch
> 4)) {
1148 --nch
; /* forget the DEDENT */
1149 for ( ; res
&& (i
< nch
); ++i
)
1150 res
= validate_stmt(CHILD(tree
, i
));
1153 res
= validate_numnodes(tree
, 4, "suite");
1160 validate_testlist(node
*tree
)
1162 return (validate_repeating_list(tree
, testlist
,
1163 validate_test
, "testlist"));
1168 validate_testlist1(node
*tree
)
1170 return (validate_repeating_list(tree
, testlist1
,
1171 validate_test
, "testlist1"));
1176 validate_testlist_safe(node
*tree
)
1178 return (validate_repeating_list(tree
, testlist_safe
,
1179 validate_old_test
, "testlist_safe"));
1183 /* '*' NAME [',' '**' NAME] | '**' NAME
1186 validate_varargslist_trailer(node
*tree
, int start
)
1188 int nch
= NCH(tree
);
1193 err_string("expected variable argument trailer for varargslist");
1196 sym
= TYPE(CHILD(tree
, start
));
1199 * ('*' NAME [',' '**' NAME]
1202 res
= validate_name(CHILD(tree
, start
+1), NULL
);
1203 else if (nch
-start
== 5)
1204 res
= (validate_name(CHILD(tree
, start
+1), NULL
)
1205 && validate_comma(CHILD(tree
, start
+2))
1206 && validate_doublestar(CHILD(tree
, start
+3))
1207 && validate_name(CHILD(tree
, start
+4), NULL
));
1209 else if (sym
== DOUBLESTAR
) {
1214 res
= validate_name(CHILD(tree
, start
+1), NULL
);
1217 err_string("illegal variable argument trailer for varargslist");
1222 /* validate_varargslist()
1225 * (fpdef ['=' test] ',')*
1226 * ('*' NAME [',' '**' NAME]
1228 * | fpdef ['=' test] (',' fpdef ['=' test])* [',']
1232 validate_varargslist(node
*tree
)
1234 int nch
= NCH(tree
);
1235 int res
= validate_ntype(tree
, varargslist
) && (nch
!= 0);
1241 err_string("varargslist missing child nodes");
1244 sym
= TYPE(CHILD(tree
, 0));
1245 if (sym
== STAR
|| sym
== DOUBLESTAR
)
1246 /* whole thing matches:
1247 * '*' NAME [',' '**' NAME] | '**' NAME
1249 res
= validate_varargslist_trailer(tree
, 0);
1250 else if (sym
== fpdef
) {
1253 sym
= TYPE(CHILD(tree
, nch
-1));
1256 * (fpdef ['=' test] ',')+
1257 * ('*' NAME [',' '**' NAME]
1260 /* skip over (fpdef ['=' test] ',')+ */
1261 while (res
&& (i
+2 <= nch
)) {
1262 res
= validate_fpdef(CHILD(tree
, i
));
1264 if (res
&& TYPE(CHILD(tree
, i
)) == EQUAL
&& (i
+2 <= nch
)) {
1265 res
= (validate_equal(CHILD(tree
, i
))
1266 && validate_test(CHILD(tree
, i
+1)));
1270 if (res
&& i
< nch
) {
1271 res
= validate_comma(CHILD(tree
, i
));
1274 && (TYPE(CHILD(tree
, i
)) == DOUBLESTAR
1275 || TYPE(CHILD(tree
, i
)) == STAR
))
1279 /* ... '*' NAME [',' '**' NAME] | '**' NAME
1283 res
= validate_varargslist_trailer(tree
, i
);
1287 * fpdef ['=' test] (',' fpdef ['=' test])* [',']
1289 /* strip trailing comma node */
1291 res
= validate_comma(CHILD(tree
, nch
-1));
1297 * fpdef ['=' test] (',' fpdef ['=' test])*
1299 res
= validate_fpdef(CHILD(tree
, 0));
1301 if (res
&& (i
+2 <= nch
) && TYPE(CHILD(tree
, i
)) == EQUAL
) {
1302 res
= (validate_equal(CHILD(tree
, i
))
1303 && validate_test(CHILD(tree
, i
+1)));
1307 * ... (',' fpdef ['=' test])*
1310 while (res
&& (nch
- i
) >= 2) {
1311 res
= (validate_comma(CHILD(tree
, i
))
1312 && validate_fpdef(CHILD(tree
, i
+1)));
1314 if (res
&& (nch
- i
) >= 2 && TYPE(CHILD(tree
, i
)) == EQUAL
) {
1315 res
= (validate_equal(CHILD(tree
, i
))
1316 && validate_test(CHILD(tree
, i
+1)));
1320 if (res
&& nch
- i
!= 0) {
1322 err_string("illegal formation for varargslist");
1330 /* list_iter: list_for | list_if
1333 validate_list_iter(node
*tree
)
1335 int res
= (validate_ntype(tree
, list_iter
)
1336 && validate_numnodes(tree
, 1, "list_iter"));
1337 if (res
&& TYPE(CHILD(tree
, 0)) == list_for
)
1338 res
= validate_list_for(CHILD(tree
, 0));
1340 res
= validate_list_if(CHILD(tree
, 0));
1345 /* gen_iter: gen_for | gen_if
1348 validate_gen_iter(node
*tree
)
1350 int res
= (validate_ntype(tree
, gen_iter
)
1351 && validate_numnodes(tree
, 1, "gen_iter"));
1352 if (res
&& TYPE(CHILD(tree
, 0)) == gen_for
)
1353 res
= validate_gen_for(CHILD(tree
, 0));
1355 res
= validate_gen_if(CHILD(tree
, 0));
1360 /* list_for: 'for' exprlist 'in' testlist [list_iter]
1363 validate_list_for(node
*tree
)
1365 int nch
= NCH(tree
);
1369 res
= validate_list_iter(CHILD(tree
, 4));
1371 res
= validate_numnodes(tree
, 4, "list_for");
1374 res
= (validate_name(CHILD(tree
, 0), "for")
1375 && validate_exprlist(CHILD(tree
, 1))
1376 && validate_name(CHILD(tree
, 2), "in")
1377 && validate_testlist_safe(CHILD(tree
, 3)));
1382 /* gen_for: 'for' exprlist 'in' test [gen_iter]
1385 validate_gen_for(node
*tree
)
1387 int nch
= NCH(tree
);
1391 res
= validate_gen_iter(CHILD(tree
, 4));
1393 res
= validate_numnodes(tree
, 4, "gen_for");
1396 res
= (validate_name(CHILD(tree
, 0), "for")
1397 && validate_exprlist(CHILD(tree
, 1))
1398 && validate_name(CHILD(tree
, 2), "in")
1399 && validate_or_test(CHILD(tree
, 3)));
1404 /* list_if: 'if' old_test [list_iter]
1407 validate_list_if(node
*tree
)
1409 int nch
= NCH(tree
);
1413 res
= validate_list_iter(CHILD(tree
, 2));
1415 res
= validate_numnodes(tree
, 2, "list_if");
1418 res
= (validate_name(CHILD(tree
, 0), "if")
1419 && validate_old_test(CHILD(tree
, 1)));
1424 /* gen_if: 'if' old_test [gen_iter]
1427 validate_gen_if(node
*tree
)
1429 int nch
= NCH(tree
);
1433 res
= validate_gen_iter(CHILD(tree
, 2));
1435 res
= validate_numnodes(tree
, 2, "gen_if");
1438 res
= (validate_name(CHILD(tree
, 0), "if")
1439 && validate_old_test(CHILD(tree
, 1)));
1451 validate_fpdef(node
*tree
)
1453 int nch
= NCH(tree
);
1454 int res
= validate_ntype(tree
, fpdef
);
1458 res
= validate_ntype(CHILD(tree
, 0), NAME
);
1460 res
= (validate_lparen(CHILD(tree
, 0))
1461 && validate_fplist(CHILD(tree
, 1))
1462 && validate_rparen(CHILD(tree
, 2)));
1464 res
= validate_numnodes(tree
, 1, "fpdef");
1471 validate_fplist(node
*tree
)
1473 return (validate_repeating_list(tree
, fplist
,
1474 validate_fpdef
, "fplist"));
1478 /* simple_stmt | compound_stmt
1482 validate_stmt(node
*tree
)
1484 int res
= (validate_ntype(tree
, stmt
)
1485 && validate_numnodes(tree
, 1, "stmt"));
1488 tree
= CHILD(tree
, 0);
1490 if (TYPE(tree
) == simple_stmt
)
1491 res
= validate_simple_stmt(tree
);
1493 res
= validate_compound_stmt(tree
);
1499 /* small_stmt (';' small_stmt)* [';'] NEWLINE
1503 validate_simple_stmt(node
*tree
)
1505 int nch
= NCH(tree
);
1506 int res
= (validate_ntype(tree
, simple_stmt
)
1508 && validate_small_stmt(CHILD(tree
, 0))
1509 && validate_newline(CHILD(tree
, nch
- 1)));
1512 res
= validate_numnodes(tree
, 2, "simple_stmt");
1513 --nch
; /* forget the NEWLINE */
1514 if (res
&& is_even(nch
))
1515 res
= validate_semi(CHILD(tree
, --nch
));
1516 if (res
&& (nch
> 2)) {
1519 for (i
= 1; res
&& (i
< nch
); i
+= 2)
1520 res
= (validate_semi(CHILD(tree
, i
))
1521 && validate_small_stmt(CHILD(tree
, i
+ 1)));
1528 validate_small_stmt(node
*tree
)
1530 int nch
= NCH(tree
);
1531 int res
= validate_numnodes(tree
, 1, "small_stmt");
1534 int ntype
= TYPE(CHILD(tree
, 0));
1536 if ( (ntype
== expr_stmt
)
1537 || (ntype
== print_stmt
)
1538 || (ntype
== del_stmt
)
1539 || (ntype
== pass_stmt
)
1540 || (ntype
== flow_stmt
)
1541 || (ntype
== import_stmt
)
1542 || (ntype
== global_stmt
)
1543 || (ntype
== assert_stmt
)
1544 || (ntype
== exec_stmt
))
1545 res
= validate_node(CHILD(tree
, 0));
1548 err_string("illegal small_stmt child type");
1551 else if (nch
== 1) {
1553 PyErr_Format(parser_error
,
1554 "Unrecognized child node of small_stmt: %d.",
1555 TYPE(CHILD(tree
, 0)));
1562 * if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated
1565 validate_compound_stmt(node
*tree
)
1567 int res
= (validate_ntype(tree
, compound_stmt
)
1568 && validate_numnodes(tree
, 1, "compound_stmt"));
1574 tree
= CHILD(tree
, 0);
1576 if ( (ntype
== if_stmt
)
1577 || (ntype
== while_stmt
)
1578 || (ntype
== for_stmt
)
1579 || (ntype
== try_stmt
)
1580 || (ntype
== with_stmt
)
1581 || (ntype
== funcdef
)
1582 || (ntype
== classdef
)
1583 || (ntype
== decorated
))
1584 res
= validate_node(tree
);
1587 PyErr_Format(parser_error
,
1588 "Illegal compound statement type: %d.", TYPE(tree
));
1594 validate_yield_or_testlist(node
*tree
)
1596 if (TYPE(tree
) == yield_expr
)
1597 return validate_yield_expr(tree
);
1599 return validate_testlist(tree
);
1603 validate_expr_stmt(node
*tree
)
1606 int nch
= NCH(tree
);
1607 int res
= (validate_ntype(tree
, expr_stmt
)
1609 && validate_testlist(CHILD(tree
, 0)));
1612 && TYPE(CHILD(tree
, 1)) == augassign
) {
1613 res
= validate_numnodes(CHILD(tree
, 1), 1, "augassign")
1614 && validate_yield_or_testlist(CHILD(tree
, 2));
1617 char *s
= STR(CHILD(CHILD(tree
, 1), 0));
1619 res
= (strcmp(s
, "+=") == 0
1620 || strcmp(s
, "-=") == 0
1621 || strcmp(s
, "*=") == 0
1622 || strcmp(s
, "/=") == 0
1623 || strcmp(s
, "//=") == 0
1624 || strcmp(s
, "%=") == 0
1625 || strcmp(s
, "&=") == 0
1626 || strcmp(s
, "|=") == 0
1627 || strcmp(s
, "^=") == 0
1628 || strcmp(s
, "<<=") == 0
1629 || strcmp(s
, ">>=") == 0
1630 || strcmp(s
, "**=") == 0);
1632 err_string("illegal augmmented assignment operator");
1636 for (j
= 1; res
&& (j
< nch
); j
+= 2)
1637 res
= validate_equal(CHILD(tree
, j
))
1638 && validate_yield_or_testlist(CHILD(tree
, j
+ 1));
1646 * 'print' ( [ test (',' test)* [','] ]
1647 * | '>>' test [ (',' test)+ [','] ] )
1650 validate_print_stmt(node
*tree
)
1652 int nch
= NCH(tree
);
1653 int res
= (validate_ntype(tree
, print_stmt
)
1655 && validate_name(CHILD(tree
, 0), "print"));
1657 if (res
&& nch
> 1) {
1658 int sym
= TYPE(CHILD(tree
, 1));
1660 int allow_trailing_comma
= 1;
1663 res
= validate_test(CHILD(tree
, i
++));
1666 res
= validate_numnodes(tree
, 3, "print_stmt");
1668 res
= (validate_ntype(CHILD(tree
, i
), RIGHTSHIFT
)
1669 && validate_test(CHILD(tree
, i
+1)));
1671 allow_trailing_comma
= 0;
1675 /* ... (',' test)* [','] */
1676 while (res
&& i
+2 <= nch
) {
1677 res
= (validate_comma(CHILD(tree
, i
))
1678 && validate_test(CHILD(tree
, i
+1)));
1679 allow_trailing_comma
= 1;
1682 if (res
&& !allow_trailing_comma
)
1683 res
= validate_numnodes(tree
, i
, "print_stmt");
1684 else if (res
&& i
< nch
)
1685 res
= validate_comma(CHILD(tree
, i
));
1693 validate_del_stmt(node
*tree
)
1695 return (validate_numnodes(tree
, 2, "del_stmt")
1696 && validate_name(CHILD(tree
, 0), "del")
1697 && validate_exprlist(CHILD(tree
, 1)));
1702 validate_return_stmt(node
*tree
)
1704 int nch
= NCH(tree
);
1705 int res
= (validate_ntype(tree
, return_stmt
)
1706 && ((nch
== 1) || (nch
== 2))
1707 && validate_name(CHILD(tree
, 0), "return"));
1709 if (res
&& (nch
== 2))
1710 res
= validate_testlist(CHILD(tree
, 1));
1717 validate_raise_stmt(node
*tree
)
1719 int nch
= NCH(tree
);
1720 int res
= (validate_ntype(tree
, raise_stmt
)
1721 && ((nch
== 1) || (nch
== 2) || (nch
== 4) || (nch
== 6)));
1724 res
= validate_name(CHILD(tree
, 0), "raise");
1725 if (res
&& (nch
>= 2))
1726 res
= validate_test(CHILD(tree
, 1));
1727 if (res
&& nch
> 2) {
1728 res
= (validate_comma(CHILD(tree
, 2))
1729 && validate_test(CHILD(tree
, 3)));
1730 if (res
&& (nch
> 4))
1731 res
= (validate_comma(CHILD(tree
, 4))
1732 && validate_test(CHILD(tree
, 5)));
1736 (void) validate_numnodes(tree
, 2, "raise");
1737 if (res
&& (nch
== 4))
1738 res
= (validate_comma(CHILD(tree
, 2))
1739 && validate_test(CHILD(tree
, 3)));
1745 /* yield_expr: 'yield' [testlist]
1748 validate_yield_expr(node
*tree
)
1750 int nch
= NCH(tree
);
1751 int res
= (validate_ntype(tree
, yield_expr
)
1752 && ((nch
== 1) || (nch
== 2))
1753 && validate_name(CHILD(tree
, 0), "yield"));
1755 if (res
&& (nch
== 2))
1756 res
= validate_testlist(CHILD(tree
, 1));
1762 /* yield_stmt: yield_expr
1765 validate_yield_stmt(node
*tree
)
1767 return (validate_ntype(tree
, yield_stmt
)
1768 && validate_numnodes(tree
, 1, "yield_stmt")
1769 && validate_yield_expr(CHILD(tree
, 0)));
1774 validate_import_as_name(node
*tree
)
1776 int nch
= NCH(tree
);
1777 int ok
= validate_ntype(tree
, import_as_name
);
1781 ok
= validate_name(CHILD(tree
, 0), NULL
);
1783 ok
= (validate_name(CHILD(tree
, 0), NULL
)
1784 && validate_name(CHILD(tree
, 1), "as")
1785 && validate_name(CHILD(tree
, 2), NULL
));
1787 ok
= validate_numnodes(tree
, 3, "import_as_name");
1793 /* dotted_name: NAME ("." NAME)*
1796 validate_dotted_name(node
*tree
)
1798 int nch
= NCH(tree
);
1799 int res
= (validate_ntype(tree
, dotted_name
)
1801 && validate_name(CHILD(tree
, 0), NULL
));
1804 for (i
= 1; res
&& (i
< nch
); i
+= 2) {
1805 res
= (validate_dot(CHILD(tree
, i
))
1806 && validate_name(CHILD(tree
, i
+1), NULL
));
1812 /* dotted_as_name: dotted_name [NAME NAME]
1815 validate_dotted_as_name(node
*tree
)
1817 int nch
= NCH(tree
);
1818 int res
= validate_ntype(tree
, dotted_as_name
);
1822 res
= validate_dotted_name(CHILD(tree
, 0));
1824 res
= (validate_dotted_name(CHILD(tree
, 0))
1825 && validate_name(CHILD(tree
, 1), "as")
1826 && validate_name(CHILD(tree
, 2), NULL
));
1829 err_string("illegal number of children for dotted_as_name");
1836 /* dotted_as_name (',' dotted_as_name)* */
1838 validate_dotted_as_names(node
*tree
)
1840 int nch
= NCH(tree
);
1841 int res
= is_odd(nch
) && validate_dotted_as_name(CHILD(tree
, 0));
1844 for (i
= 1; res
&& (i
< nch
); i
+= 2)
1845 res
= (validate_comma(CHILD(tree
, i
))
1846 && validate_dotted_as_name(CHILD(tree
, i
+ 1)));
1851 /* import_as_name (',' import_as_name)* [','] */
1853 validate_import_as_names(node
*tree
)
1855 int nch
= NCH(tree
);
1856 int res
= validate_import_as_name(CHILD(tree
, 0));
1859 for (i
= 1; res
&& (i
+ 1 < nch
); i
+= 2)
1860 res
= (validate_comma(CHILD(tree
, i
))
1861 && validate_import_as_name(CHILD(tree
, i
+ 1)));
1866 /* 'import' dotted_as_names */
1868 validate_import_name(node
*tree
)
1870 return (validate_ntype(tree
, import_name
)
1871 && validate_numnodes(tree
, 2, "import_name")
1872 && validate_name(CHILD(tree
, 0), "import")
1873 && validate_dotted_as_names(CHILD(tree
, 1)));
1876 /* Helper function to count the number of leading dots in
1877 * 'from ...module import name'
1880 count_from_dots(node
*tree
)
1883 for (i
= 1; i
< NCH(tree
); i
++)
1884 if (TYPE(CHILD(tree
, i
)) != DOT
)
1889 /* 'from' ('.'* dotted_name | '.') 'import' ('*' | '(' import_as_names ')' |
1893 validate_import_from(node
*tree
)
1895 int nch
= NCH(tree
);
1896 int ndots
= count_from_dots(tree
);
1897 int havename
= (TYPE(CHILD(tree
, ndots
+ 1)) == dotted_name
);
1898 int offset
= ndots
+ havename
;
1899 int res
= validate_ntype(tree
, import_from
)
1900 && (nch
>= 4 + ndots
)
1901 && validate_name(CHILD(tree
, 0), "from")
1902 && (!havename
|| validate_dotted_name(CHILD(tree
, ndots
+ 1)))
1903 && validate_name(CHILD(tree
, offset
+ 1), "import");
1905 if (res
&& TYPE(CHILD(tree
, offset
+ 2)) == LPAR
)
1906 res
= ((nch
== offset
+ 5)
1907 && validate_lparen(CHILD(tree
, offset
+ 2))
1908 && validate_import_as_names(CHILD(tree
, offset
+ 3))
1909 && validate_rparen(CHILD(tree
, offset
+ 4)));
1910 else if (res
&& TYPE(CHILD(tree
, offset
+ 2)) != STAR
)
1911 res
= validate_import_as_names(CHILD(tree
, offset
+ 2));
1916 /* import_stmt: import_name | import_from */
1918 validate_import_stmt(node
*tree
)
1920 int nch
= NCH(tree
);
1921 int res
= validate_numnodes(tree
, 1, "import_stmt");
1924 int ntype
= TYPE(CHILD(tree
, 0));
1926 if (ntype
== import_name
|| ntype
== import_from
)
1927 res
= validate_node(CHILD(tree
, 0));
1930 err_string("illegal import_stmt child type");
1933 else if (nch
== 1) {
1935 PyErr_Format(parser_error
,
1936 "Unrecognized child node of import_stmt: %d.",
1937 TYPE(CHILD(tree
, 0)));
1946 validate_global_stmt(node
*tree
)
1949 int nch
= NCH(tree
);
1950 int res
= (validate_ntype(tree
, global_stmt
)
1951 && is_even(nch
) && (nch
>= 2));
1953 if (!res
&& !PyErr_Occurred())
1954 err_string("illegal global statement");
1957 res
= (validate_name(CHILD(tree
, 0), "global")
1958 && validate_ntype(CHILD(tree
, 1), NAME
));
1959 for (j
= 2; res
&& (j
< nch
); j
+= 2)
1960 res
= (validate_comma(CHILD(tree
, j
))
1961 && validate_ntype(CHILD(tree
, j
+ 1), NAME
));
1969 * 'exec' expr ['in' test [',' test]]
1972 validate_exec_stmt(node
*tree
)
1974 int nch
= NCH(tree
);
1975 int res
= (validate_ntype(tree
, exec_stmt
)
1976 && ((nch
== 2) || (nch
== 4) || (nch
== 6))
1977 && validate_name(CHILD(tree
, 0), "exec")
1978 && validate_expr(CHILD(tree
, 1)));
1980 if (!res
&& !PyErr_Occurred())
1981 err_string("illegal exec statement");
1982 if (res
&& (nch
> 2))
1983 res
= (validate_name(CHILD(tree
, 2), "in")
1984 && validate_test(CHILD(tree
, 3)));
1985 if (res
&& (nch
== 6))
1986 res
= (validate_comma(CHILD(tree
, 4))
1987 && validate_test(CHILD(tree
, 5)));
1995 * 'assert' test [',' test]
1998 validate_assert_stmt(node
*tree
)
2000 int nch
= NCH(tree
);
2001 int res
= (validate_ntype(tree
, assert_stmt
)
2002 && ((nch
== 2) || (nch
== 4))
2003 && (validate_name(CHILD(tree
, 0), "assert"))
2004 && validate_test(CHILD(tree
, 1)));
2006 if (!res
&& !PyErr_Occurred())
2007 err_string("illegal assert statement");
2008 if (res
&& (nch
> 2))
2009 res
= (validate_comma(CHILD(tree
, 2))
2010 && validate_test(CHILD(tree
, 3)));
2017 validate_while(node
*tree
)
2019 int nch
= NCH(tree
);
2020 int res
= (validate_ntype(tree
, while_stmt
)
2021 && ((nch
== 4) || (nch
== 7))
2022 && validate_name(CHILD(tree
, 0), "while")
2023 && validate_test(CHILD(tree
, 1))
2024 && validate_colon(CHILD(tree
, 2))
2025 && validate_suite(CHILD(tree
, 3)));
2027 if (res
&& (nch
== 7))
2028 res
= (validate_name(CHILD(tree
, 4), "else")
2029 && validate_colon(CHILD(tree
, 5))
2030 && validate_suite(CHILD(tree
, 6)));
2037 validate_for(node
*tree
)
2039 int nch
= NCH(tree
);
2040 int res
= (validate_ntype(tree
, for_stmt
)
2041 && ((nch
== 6) || (nch
== 9))
2042 && validate_name(CHILD(tree
, 0), "for")
2043 && validate_exprlist(CHILD(tree
, 1))
2044 && validate_name(CHILD(tree
, 2), "in")
2045 && validate_testlist(CHILD(tree
, 3))
2046 && validate_colon(CHILD(tree
, 4))
2047 && validate_suite(CHILD(tree
, 5)));
2049 if (res
&& (nch
== 9))
2050 res
= (validate_name(CHILD(tree
, 6), "else")
2051 && validate_colon(CHILD(tree
, 7))
2052 && validate_suite(CHILD(tree
, 8)));
2059 * 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2060 ['finally' ':' suite]
2061 * | 'try' ':' suite 'finally' ':' suite
2065 validate_try(node
*tree
)
2067 int nch
= NCH(tree
);
2069 int res
= (validate_ntype(tree
, try_stmt
)
2070 && (nch
>= 6) && ((nch
% 3) == 0));
2073 res
= (validate_name(CHILD(tree
, 0), "try")
2074 && validate_colon(CHILD(tree
, 1))
2075 && validate_suite(CHILD(tree
, 2))
2076 && validate_colon(CHILD(tree
, nch
- 2))
2077 && validate_suite(CHILD(tree
, nch
- 1)));
2078 else if (!PyErr_Occurred()) {
2079 const char* name
= "except";
2080 if (TYPE(CHILD(tree
, nch
- 3)) != except_clause
)
2081 name
= STR(CHILD(tree
, nch
- 3));
2083 PyErr_Format(parser_error
,
2084 "Illegal number of children for try/%s node.", name
);
2086 /* Handle try/finally statement */
2087 if (res
&& (TYPE(CHILD(tree
, pos
)) == NAME
) &&
2088 (strcmp(STR(CHILD(tree
, pos
)), "finally") == 0)) {
2089 res
= (validate_numnodes(tree
, 6, "try/finally")
2090 && validate_colon(CHILD(tree
, 4))
2091 && validate_suite(CHILD(tree
, 5)));
2094 /* try/except statement: skip past except_clause sections */
2095 while (res
&& pos
< nch
&& (TYPE(CHILD(tree
, pos
)) == except_clause
)) {
2096 res
= (validate_except_clause(CHILD(tree
, pos
))
2097 && validate_colon(CHILD(tree
, pos
+ 1))
2098 && validate_suite(CHILD(tree
, pos
+ 2)));
2101 /* skip else clause */
2102 if (res
&& pos
< nch
&& (TYPE(CHILD(tree
, pos
)) == NAME
) &&
2103 (strcmp(STR(CHILD(tree
, pos
)), "else") == 0)) {
2104 res
= (validate_colon(CHILD(tree
, pos
+ 1))
2105 && validate_suite(CHILD(tree
, pos
+ 2)));
2108 if (res
&& pos
< nch
) {
2109 /* last clause must be a finally */
2110 res
= (validate_name(CHILD(tree
, pos
), "finally")
2111 && validate_numnodes(tree
, pos
+ 3, "try/except/finally")
2112 && validate_colon(CHILD(tree
, pos
+ 1))
2113 && validate_suite(CHILD(tree
, pos
+ 2)));
2120 validate_except_clause(node
*tree
)
2122 int nch
= NCH(tree
);
2123 int res
= (validate_ntype(tree
, except_clause
)
2124 && ((nch
== 1) || (nch
== 2) || (nch
== 4))
2125 && validate_name(CHILD(tree
, 0), "except"));
2127 if (res
&& (nch
> 1))
2128 res
= validate_test(CHILD(tree
, 1));
2129 if (res
&& (nch
== 4))
2130 res
= (validate_comma(CHILD(tree
, 2))
2131 && validate_test(CHILD(tree
, 3)));
2138 validate_test(node
*tree
)
2140 int nch
= NCH(tree
);
2141 int res
= validate_ntype(tree
, test
) && is_odd(nch
);
2143 if (res
&& (TYPE(CHILD(tree
, 0)) == lambdef
))
2145 && validate_lambdef(CHILD(tree
, 0)));
2147 res
= validate_or_test(CHILD(tree
, 0));
2148 res
= (res
&& (nch
== 1 || (nch
== 5 &&
2149 validate_name(CHILD(tree
, 1), "if") &&
2150 validate_or_test(CHILD(tree
, 2)) &&
2151 validate_name(CHILD(tree
, 3), "else") &&
2152 validate_test(CHILD(tree
, 4)))));
2158 validate_old_test(node
*tree
)
2160 int nch
= NCH(tree
);
2161 int res
= validate_ntype(tree
, old_test
) && (nch
== 1);
2163 if (res
&& (TYPE(CHILD(tree
, 0)) == old_lambdef
))
2164 res
= (validate_old_lambdef(CHILD(tree
, 0)));
2166 res
= (validate_or_test(CHILD(tree
, 0)));
2172 validate_or_test(node
*tree
)
2174 int nch
= NCH(tree
);
2175 int res
= validate_ntype(tree
, or_test
) && is_odd(nch
);
2179 res
= validate_and_test(CHILD(tree
, 0));
2180 for (pos
= 1; res
&& (pos
< nch
); pos
+= 2)
2181 res
= (validate_name(CHILD(tree
, pos
), "or")
2182 && validate_and_test(CHILD(tree
, pos
+ 1)));
2189 validate_and_test(node
*tree
)
2192 int nch
= NCH(tree
);
2193 int res
= (validate_ntype(tree
, and_test
)
2195 && validate_not_test(CHILD(tree
, 0)));
2197 for (pos
= 1; res
&& (pos
< nch
); pos
+= 2)
2198 res
= (validate_name(CHILD(tree
, pos
), "and")
2199 && validate_not_test(CHILD(tree
, 0)));
2206 validate_not_test(node
*tree
)
2208 int nch
= NCH(tree
);
2209 int res
= validate_ntype(tree
, not_test
) && ((nch
== 1) || (nch
== 2));
2213 res
= (validate_name(CHILD(tree
, 0), "not")
2214 && validate_not_test(CHILD(tree
, 1)));
2216 res
= validate_comparison(CHILD(tree
, 0));
2223 validate_comparison(node
*tree
)
2226 int nch
= NCH(tree
);
2227 int res
= (validate_ntype(tree
, comparison
)
2229 && validate_expr(CHILD(tree
, 0)));
2231 for (pos
= 1; res
&& (pos
< nch
); pos
+= 2)
2232 res
= (validate_comp_op(CHILD(tree
, pos
))
2233 && validate_expr(CHILD(tree
, pos
+ 1)));
2240 validate_comp_op(node
*tree
)
2243 int nch
= NCH(tree
);
2245 if (!validate_ntype(tree
, comp_op
))
2249 * Only child will be a terminal with a well-defined symbolic name
2250 * or a NAME with a string of either 'is' or 'in'
2252 tree
= CHILD(tree
, 0);
2253 switch (TYPE(tree
)) {
2264 res
= ((strcmp(STR(tree
), "in") == 0)
2265 || (strcmp(STR(tree
), "is") == 0));
2267 PyErr_Format(parser_error
,
2268 "illegal operator '%s'", STR(tree
));
2272 err_string("illegal comparison operator type");
2276 else if ((res
= validate_numnodes(tree
, 2, "comp_op")) != 0) {
2277 res
= (validate_ntype(CHILD(tree
, 0), NAME
)
2278 && validate_ntype(CHILD(tree
, 1), NAME
)
2279 && (((strcmp(STR(CHILD(tree
, 0)), "is") == 0)
2280 && (strcmp(STR(CHILD(tree
, 1)), "not") == 0))
2281 || ((strcmp(STR(CHILD(tree
, 0)), "not") == 0)
2282 && (strcmp(STR(CHILD(tree
, 1)), "in") == 0))));
2283 if (!res
&& !PyErr_Occurred())
2284 err_string("unknown comparison operator");
2291 validate_expr(node
*tree
)
2294 int nch
= NCH(tree
);
2295 int res
= (validate_ntype(tree
, expr
)
2297 && validate_xor_expr(CHILD(tree
, 0)));
2299 for (j
= 2; res
&& (j
< nch
); j
+= 2)
2300 res
= (validate_xor_expr(CHILD(tree
, j
))
2301 && validate_vbar(CHILD(tree
, j
- 1)));
2308 validate_xor_expr(node
*tree
)
2311 int nch
= NCH(tree
);
2312 int res
= (validate_ntype(tree
, xor_expr
)
2314 && validate_and_expr(CHILD(tree
, 0)));
2316 for (j
= 2; res
&& (j
< nch
); j
+= 2)
2317 res
= (validate_circumflex(CHILD(tree
, j
- 1))
2318 && validate_and_expr(CHILD(tree
, j
)));
2325 validate_and_expr(node
*tree
)
2328 int nch
= NCH(tree
);
2329 int res
= (validate_ntype(tree
, and_expr
)
2331 && validate_shift_expr(CHILD(tree
, 0)));
2333 for (pos
= 1; res
&& (pos
< nch
); pos
+= 2)
2334 res
= (validate_ampersand(CHILD(tree
, pos
))
2335 && validate_shift_expr(CHILD(tree
, pos
+ 1)));
2342 validate_chain_two_ops(node
*tree
, int (*termvalid
)(node
*), int op1
, int op2
)
2345 int nch
= NCH(tree
);
2346 int res
= (is_odd(nch
)
2347 && (*termvalid
)(CHILD(tree
, 0)));
2349 for ( ; res
&& (pos
< nch
); pos
+= 2) {
2350 if (TYPE(CHILD(tree
, pos
)) != op1
)
2351 res
= validate_ntype(CHILD(tree
, pos
), op2
);
2353 res
= (*termvalid
)(CHILD(tree
, pos
+ 1));
2360 validate_shift_expr(node
*tree
)
2362 return (validate_ntype(tree
, shift_expr
)
2363 && validate_chain_two_ops(tree
, validate_arith_expr
,
2364 LEFTSHIFT
, RIGHTSHIFT
));
2369 validate_arith_expr(node
*tree
)
2371 return (validate_ntype(tree
, arith_expr
)
2372 && validate_chain_two_ops(tree
, validate_term
, PLUS
, MINUS
));
2377 validate_term(node
*tree
)
2380 int nch
= NCH(tree
);
2381 int res
= (validate_ntype(tree
, term
)
2383 && validate_factor(CHILD(tree
, 0)));
2385 for ( ; res
&& (pos
< nch
); pos
+= 2)
2386 res
= (((TYPE(CHILD(tree
, pos
)) == STAR
)
2387 || (TYPE(CHILD(tree
, pos
)) == SLASH
)
2388 || (TYPE(CHILD(tree
, pos
)) == DOUBLESLASH
)
2389 || (TYPE(CHILD(tree
, pos
)) == PERCENT
))
2390 && validate_factor(CHILD(tree
, pos
+ 1)));
2398 * factor: ('+'|'-'|'~') factor | power
2401 validate_factor(node
*tree
)
2403 int nch
= NCH(tree
);
2404 int res
= (validate_ntype(tree
, factor
)
2406 && ((TYPE(CHILD(tree
, 0)) == PLUS
)
2407 || (TYPE(CHILD(tree
, 0)) == MINUS
)
2408 || (TYPE(CHILD(tree
, 0)) == TILDE
))
2409 && validate_factor(CHILD(tree
, 1)))
2411 && validate_power(CHILD(tree
, 0)))));
2418 * power: atom trailer* ('**' factor)*
2421 validate_power(node
*tree
)
2424 int nch
= NCH(tree
);
2425 int res
= (validate_ntype(tree
, power
) && (nch
>= 1)
2426 && validate_atom(CHILD(tree
, 0)));
2428 while (res
&& (pos
< nch
) && (TYPE(CHILD(tree
, pos
)) == trailer
))
2429 res
= validate_trailer(CHILD(tree
, pos
++));
2430 if (res
&& (pos
< nch
)) {
2431 if (!is_even(nch
- pos
)) {
2432 err_string("illegal number of nodes for 'power'");
2435 for ( ; res
&& (pos
< (nch
- 1)); pos
+= 2)
2436 res
= (validate_doublestar(CHILD(tree
, pos
))
2437 && validate_factor(CHILD(tree
, pos
+ 1)));
2444 validate_atom(node
*tree
)
2447 int nch
= NCH(tree
);
2448 int res
= validate_ntype(tree
, atom
);
2451 res
= validate_numnodes(tree
, nch
+1, "atom");
2453 switch (TYPE(CHILD(tree
, 0))) {
2456 && (validate_rparen(CHILD(tree
, nch
- 1))));
2458 if (res
&& (nch
== 3)) {
2459 if (TYPE(CHILD(tree
, 1))==yield_expr
)
2460 res
= validate_yield_expr(CHILD(tree
, 1));
2462 res
= validate_testlist_gexp(CHILD(tree
, 1));
2467 res
= validate_ntype(CHILD(tree
, 1), RSQB
);
2469 res
= (validate_listmaker(CHILD(tree
, 1))
2470 && validate_ntype(CHILD(tree
, 2), RSQB
));
2473 err_string("illegal list display atom");
2478 && validate_ntype(CHILD(tree
, nch
- 1), RBRACE
));
2480 if (res
&& (nch
== 3))
2481 res
= validate_dictmaker(CHILD(tree
, 1));
2485 && validate_testlist1(CHILD(tree
, 1))
2486 && validate_ntype(CHILD(tree
, 2), BACKQUOTE
));
2493 for (pos
= 1; res
&& (pos
< nch
); ++pos
)
2494 res
= validate_ntype(CHILD(tree
, pos
), STRING
);
2506 * test ( list_for | (',' test)* [','] )
2509 validate_listmaker(node
*tree
)
2511 int nch
= NCH(tree
);
2515 err_string("missing child nodes of listmaker");
2517 ok
= validate_test(CHILD(tree
, 0));
2520 * list_for | (',' test)* [',']
2522 if (nch
== 2 && TYPE(CHILD(tree
, 1)) == list_for
)
2523 ok
= validate_list_for(CHILD(tree
, 1));
2525 /* (',' test)* [','] */
2527 while (ok
&& nch
- i
>= 2) {
2528 ok
= (validate_comma(CHILD(tree
, i
))
2529 && validate_test(CHILD(tree
, i
+1)));
2532 if (ok
&& i
== nch
-1)
2533 ok
= validate_comma(CHILD(tree
, i
));
2534 else if (i
!= nch
) {
2536 err_string("illegal trailing nodes for listmaker");
2543 * test ( gen_for | (',' test)* [','] )
2546 validate_testlist_gexp(node
*tree
)
2548 int nch
= NCH(tree
);
2552 err_string("missing child nodes of testlist_gexp");
2554 ok
= validate_test(CHILD(tree
, 0));
2558 * gen_for | (',' test)* [',']
2560 if (nch
== 2 && TYPE(CHILD(tree
, 1)) == gen_for
)
2561 ok
= validate_gen_for(CHILD(tree
, 1));
2563 /* (',' test)* [','] */
2565 while (ok
&& nch
- i
>= 2) {
2566 ok
= (validate_comma(CHILD(tree
, i
))
2567 && validate_test(CHILD(tree
, i
+1)));
2570 if (ok
&& i
== nch
-1)
2571 ok
= validate_comma(CHILD(tree
, i
));
2572 else if (i
!= nch
) {
2574 err_string("illegal trailing nodes for testlist_gexp");
2581 * '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
2584 validate_decorator(node
*tree
)
2587 int nch
= NCH(tree
);
2588 ok
= (validate_ntype(tree
, decorator
) &&
2589 (nch
== 3 || nch
== 5 || nch
== 6) &&
2590 validate_at(CHILD(tree
, 0)) &&
2591 validate_dotted_name(CHILD(tree
, 1)) &&
2592 validate_newline(RCHILD(tree
, -1)));
2594 if (ok
&& nch
!= 3) {
2595 ok
= (validate_lparen(CHILD(tree
, 2)) &&
2596 validate_rparen(RCHILD(tree
, -2)));
2599 ok
= validate_arglist(CHILD(tree
, 3));
2609 validate_decorators(node
*tree
)
2613 ok
= validate_ntype(tree
, decorators
) && nch
>= 1;
2615 for (i
= 0; ok
&& i
< nch
; ++i
)
2616 ok
= validate_decorator(CHILD(tree
, i
));
2625 validate_with_item(node
*tree
)
2627 int nch
= NCH(tree
);
2628 int ok
= (validate_ntype(tree
, with_item
)
2629 && (nch
== 1 || nch
== 3)
2630 && validate_test(CHILD(tree
, 0)));
2632 ok
= (validate_name(CHILD(tree
, 1), "as")
2633 && validate_expr(CHILD(tree
, 2)));
2639 * 'with' with_item (',' with_item)* ':' suite
2642 validate_with_stmt(node
*tree
)
2645 int nch
= NCH(tree
);
2646 int ok
= (validate_ntype(tree
, with_stmt
)
2648 && validate_name(CHILD(tree
, 0), "with")
2649 && validate_colon(RCHILD(tree
, -2))
2650 && validate_suite(RCHILD(tree
, -1)));
2651 for (i
= 1; ok
&& i
< nch
- 2; i
+= 2)
2652 ok
= validate_with_item(CHILD(tree
, i
));
2659 * 'def' NAME parameters ':' suite
2662 validate_funcdef(node
*tree
)
2664 int nch
= NCH(tree
);
2665 int ok
= (validate_ntype(tree
, funcdef
)
2667 && validate_name(RCHILD(tree
, -5), "def")
2668 && validate_ntype(RCHILD(tree
, -4), NAME
)
2669 && validate_colon(RCHILD(tree
, -2))
2670 && validate_parameters(RCHILD(tree
, -3))
2671 && validate_suite(RCHILD(tree
, -1)));
2677 * decorators (classdef | funcdef)
2680 validate_decorated(node
*tree
)
2682 int nch
= NCH(tree
);
2683 int ok
= (validate_ntype(tree
, decorated
)
2685 && validate_decorators(RCHILD(tree
, -2))
2686 && (validate_funcdef(RCHILD(tree
, -1))
2687 || validate_class(RCHILD(tree
, -1)))
2693 validate_lambdef(node
*tree
)
2695 int nch
= NCH(tree
);
2696 int res
= (validate_ntype(tree
, lambdef
)
2697 && ((nch
== 3) || (nch
== 4))
2698 && validate_name(CHILD(tree
, 0), "lambda")
2699 && validate_colon(CHILD(tree
, nch
- 2))
2700 && validate_test(CHILD(tree
, nch
- 1)));
2702 if (res
&& (nch
== 4))
2703 res
= validate_varargslist(CHILD(tree
, 1));
2704 else if (!res
&& !PyErr_Occurred())
2705 (void) validate_numnodes(tree
, 3, "lambdef");
2712 validate_old_lambdef(node
*tree
)
2714 int nch
= NCH(tree
);
2715 int res
= (validate_ntype(tree
, old_lambdef
)
2716 && ((nch
== 3) || (nch
== 4))
2717 && validate_name(CHILD(tree
, 0), "lambda")
2718 && validate_colon(CHILD(tree
, nch
- 2))
2719 && validate_test(CHILD(tree
, nch
- 1)));
2721 if (res
&& (nch
== 4))
2722 res
= validate_varargslist(CHILD(tree
, 1));
2723 else if (!res
&& !PyErr_Occurred())
2724 (void) validate_numnodes(tree
, 3, "old_lambdef");
2732 * (argument ',')* (argument [','] | '*' test [',' '**' test] | '**' test)
2735 validate_arglist(node
*tree
)
2737 int nch
= NCH(tree
);
2742 /* raise the right error from having an invalid number of children */
2743 return validate_numnodes(tree
, nch
+ 1, "arglist");
2746 for (i
=0; i
<nch
; i
++) {
2747 if (TYPE(CHILD(tree
, i
)) == argument
) {
2748 node
*ch
= CHILD(tree
, i
);
2749 if (NCH(ch
) == 2 && TYPE(CHILD(ch
, 1)) == gen_for
) {
2750 err_string("need '(', ')' for generator expression");
2757 while (ok
&& nch
-i
>= 2) {
2758 /* skip leading (argument ',') */
2759 ok
= (validate_argument(CHILD(tree
, i
))
2760 && validate_comma(CHILD(tree
, i
+1)));
2769 * argument | '*' test [',' '**' test] | '**' test
2771 int sym
= TYPE(CHILD(tree
, i
));
2773 if (sym
== argument
) {
2774 ok
= validate_argument(CHILD(tree
, i
));
2775 if (ok
&& i
+1 != nch
) {
2776 err_string("illegal arglist specification"
2777 " (extra stuff on end)");
2781 else if (sym
== STAR
) {
2782 ok
= validate_star(CHILD(tree
, i
));
2783 if (ok
&& (nch
-i
== 2))
2784 ok
= validate_test(CHILD(tree
, i
+1));
2785 else if (ok
&& (nch
-i
== 5))
2786 ok
= (validate_test(CHILD(tree
, i
+1))
2787 && validate_comma(CHILD(tree
, i
+2))
2788 && validate_doublestar(CHILD(tree
, i
+3))
2789 && validate_test(CHILD(tree
, i
+4)));
2791 err_string("illegal use of '*' in arglist");
2795 else if (sym
== DOUBLESTAR
) {
2797 ok
= (validate_doublestar(CHILD(tree
, i
))
2798 && validate_test(CHILD(tree
, i
+1)));
2800 err_string("illegal use of '**' in arglist");
2805 err_string("illegal arglist specification");
2816 * [test '='] test [gen_for]
2819 validate_argument(node
*tree
)
2821 int nch
= NCH(tree
);
2822 int res
= (validate_ntype(tree
, argument
)
2823 && ((nch
== 1) || (nch
== 2) || (nch
== 3))
2824 && validate_test(CHILD(tree
, 0)));
2826 if (res
&& (nch
== 2))
2827 res
= validate_gen_for(CHILD(tree
, 1));
2828 else if (res
&& (nch
== 3))
2829 res
= (validate_equal(CHILD(tree
, 1))
2830 && validate_test(CHILD(tree
, 2)));
2839 * '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
2842 validate_trailer(node
*tree
)
2844 int nch
= NCH(tree
);
2845 int res
= validate_ntype(tree
, trailer
) && ((nch
== 2) || (nch
== 3));
2848 switch (TYPE(CHILD(tree
, 0))) {
2850 res
= validate_rparen(CHILD(tree
, nch
- 1));
2851 if (res
&& (nch
== 3))
2852 res
= validate_arglist(CHILD(tree
, 1));
2855 res
= (validate_numnodes(tree
, 3, "trailer")
2856 && validate_subscriptlist(CHILD(tree
, 1))
2857 && validate_ntype(CHILD(tree
, 2), RSQB
));
2860 res
= (validate_numnodes(tree
, 2, "trailer")
2861 && validate_ntype(CHILD(tree
, 1), NAME
));
2869 (void) validate_numnodes(tree
, 2, "trailer");
2877 * subscript (',' subscript)* [',']
2880 validate_subscriptlist(node
*tree
)
2882 return (validate_repeating_list(tree
, subscriptlist
,
2883 validate_subscript
, "subscriptlist"));
2889 * '.' '.' '.' | test | [test] ':' [test] [sliceop]
2892 validate_subscript(node
*tree
)
2895 int nch
= NCH(tree
);
2896 int res
= validate_ntype(tree
, subscript
) && (nch
>= 1) && (nch
<= 4);
2899 if (!PyErr_Occurred())
2900 err_string("invalid number of arguments for subscript node");
2903 if (TYPE(CHILD(tree
, 0)) == DOT
)
2904 /* take care of ('.' '.' '.') possibility */
2905 return (validate_numnodes(tree
, 3, "subscript")
2906 && validate_dot(CHILD(tree
, 0))
2907 && validate_dot(CHILD(tree
, 1))
2908 && validate_dot(CHILD(tree
, 2)));
2910 if (TYPE(CHILD(tree
, 0)) == test
)
2911 res
= validate_test(CHILD(tree
, 0));
2913 res
= validate_colon(CHILD(tree
, 0));
2916 /* Must be [test] ':' [test] [sliceop],
2917 * but at least one of the optional components will
2918 * be present, but we don't know which yet.
2920 if ((TYPE(CHILD(tree
, 0)) != COLON
) || (nch
== 4)) {
2921 res
= validate_test(CHILD(tree
, 0));
2925 res
= validate_colon(CHILD(tree
, offset
));
2927 int rem
= nch
- ++offset
;
2929 if (TYPE(CHILD(tree
, offset
)) == test
) {
2930 res
= validate_test(CHILD(tree
, offset
));
2935 res
= validate_sliceop(CHILD(tree
, offset
));
2943 validate_sliceop(node
*tree
)
2945 int nch
= NCH(tree
);
2946 int res
= ((nch
== 1) || validate_numnodes(tree
, 2, "sliceop"))
2947 && validate_ntype(tree
, sliceop
);
2948 if (!res
&& !PyErr_Occurred()) {
2949 res
= validate_numnodes(tree
, 1, "sliceop");
2952 res
= validate_colon(CHILD(tree
, 0));
2953 if (res
&& (nch
== 2))
2954 res
= validate_test(CHILD(tree
, 1));
2961 validate_exprlist(node
*tree
)
2963 return (validate_repeating_list(tree
, exprlist
,
2964 validate_expr
, "exprlist"));
2969 validate_dictmaker(node
*tree
)
2971 int nch
= NCH(tree
);
2972 int res
= (validate_ntype(tree
, dictmaker
)
2974 && validate_test(CHILD(tree
, 0))
2975 && validate_colon(CHILD(tree
, 1))
2976 && validate_test(CHILD(tree
, 2)));
2978 if (res
&& ((nch
% 4) == 0))
2979 res
= validate_comma(CHILD(tree
, --nch
));
2981 res
= ((nch
% 4) == 3);
2983 if (res
&& (nch
> 3)) {
2985 /* ( ',' test ':' test )* */
2986 while (res
&& (pos
< nch
)) {
2987 res
= (validate_comma(CHILD(tree
, pos
))
2988 && validate_test(CHILD(tree
, pos
+ 1))
2989 && validate_colon(CHILD(tree
, pos
+ 2))
2990 && validate_test(CHILD(tree
, pos
+ 3)));
2999 validate_eval_input(node
*tree
)
3002 int nch
= NCH(tree
);
3003 int res
= (validate_ntype(tree
, eval_input
)
3005 && validate_testlist(CHILD(tree
, 0))
3006 && validate_ntype(CHILD(tree
, nch
- 1), ENDMARKER
));
3008 for (pos
= 1; res
&& (pos
< (nch
- 1)); ++pos
)
3009 res
= validate_ntype(CHILD(tree
, pos
), NEWLINE
);
3016 validate_node(node
*tree
)
3018 int nch
= 0; /* num. children on current node */
3019 int res
= 1; /* result value */
3020 node
* next
= 0; /* node to process after this one */
3022 while (res
&& (tree
!= 0)) {
3025 switch (TYPE(tree
)) {
3030 res
= validate_funcdef(tree
);
3033 res
= validate_with_stmt(tree
);
3036 res
= validate_class(tree
);
3039 res
= validate_decorated(tree
);
3042 * "Trivial" parse tree nodes.
3043 * (Why did I call these trivial?)
3046 res
= validate_stmt(tree
);
3050 * expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt
3051 * | import_stmt | global_stmt | exec_stmt | assert_stmt
3053 res
= validate_small_stmt(tree
);
3056 res
= (validate_numnodes(tree
, 1, "flow_stmt")
3057 && ((TYPE(CHILD(tree
, 0)) == break_stmt
)
3058 || (TYPE(CHILD(tree
, 0)) == continue_stmt
)
3059 || (TYPE(CHILD(tree
, 0)) == yield_stmt
)
3060 || (TYPE(CHILD(tree
, 0)) == return_stmt
)
3061 || (TYPE(CHILD(tree
, 0)) == raise_stmt
)));
3063 next
= CHILD(tree
, 0);
3065 err_string("illegal flow_stmt type");
3068 res
= validate_yield_stmt(tree
);
3071 * Compound statements.
3074 res
= validate_simple_stmt(tree
);
3077 res
= validate_compound_stmt(tree
);
3080 * Fundamental statements.
3083 res
= validate_expr_stmt(tree
);
3086 res
= validate_print_stmt(tree
);
3089 res
= validate_del_stmt(tree
);
3092 res
= (validate_numnodes(tree
, 1, "pass")
3093 && validate_name(CHILD(tree
, 0), "pass"));
3096 res
= (validate_numnodes(tree
, 1, "break")
3097 && validate_name(CHILD(tree
, 0), "break"));
3100 res
= (validate_numnodes(tree
, 1, "continue")
3101 && validate_name(CHILD(tree
, 0), "continue"));
3104 res
= validate_return_stmt(tree
);
3107 res
= validate_raise_stmt(tree
);
3110 res
= validate_import_stmt(tree
);
3113 res
= validate_import_name(tree
);
3116 res
= validate_import_from(tree
);
3119 res
= validate_global_stmt(tree
);
3122 res
= validate_exec_stmt(tree
);
3125 res
= validate_assert_stmt(tree
);
3128 res
= validate_if(tree
);
3131 res
= validate_while(tree
);
3134 res
= validate_for(tree
);
3137 res
= validate_try(tree
);
3140 res
= validate_suite(tree
);
3146 res
= validate_testlist(tree
);
3149 res
= validate_yield_expr(tree
);
3152 res
= validate_testlist1(tree
);
3155 res
= validate_test(tree
);
3158 res
= validate_and_test(tree
);
3161 res
= validate_not_test(tree
);
3164 res
= validate_comparison(tree
);
3167 res
= validate_exprlist(tree
);
3170 res
= validate_comp_op(tree
);
3173 res
= validate_expr(tree
);
3176 res
= validate_xor_expr(tree
);
3179 res
= validate_and_expr(tree
);
3182 res
= validate_shift_expr(tree
);
3185 res
= validate_arith_expr(tree
);
3188 res
= validate_term(tree
);
3191 res
= validate_factor(tree
);
3194 res
= validate_power(tree
);
3197 res
= validate_atom(tree
);
3201 /* Hopefully never reached! */
3202 err_string("unrecognized node type");
3213 validate_expr_tree(node
*tree
)
3215 int res
= validate_eval_input(tree
);
3217 if (!res
&& !PyErr_Occurred())
3218 err_string("could not validate expression tuple");
3225 * (NEWLINE | stmt)* ENDMARKER
3228 validate_file_input(node
*tree
)
3231 int nch
= NCH(tree
) - 1;
3232 int res
= ((nch
>= 0)
3233 && validate_ntype(CHILD(tree
, nch
), ENDMARKER
));
3235 for (j
= 0; res
&& (j
< nch
); ++j
) {
3236 if (TYPE(CHILD(tree
, j
)) == stmt
)
3237 res
= validate_stmt(CHILD(tree
, j
));
3239 res
= validate_newline(CHILD(tree
, j
));
3241 /* This stays in to prevent any internal failures from getting to the
3242 * user. Hopefully, this won't be needed. If a user reports getting
3243 * this, we have some debugging to do.
3245 if (!res
&& !PyErr_Occurred())
3246 err_string("VALIDATION FAILURE: report this to the maintainer!");
3252 validate_encoding_decl(node
*tree
)
3254 int nch
= NCH(tree
);
3255 int res
= ((nch
== 1)
3256 && validate_file_input(CHILD(tree
, 0)));
3258 if (!res
&& !PyErr_Occurred())
3259 err_string("Error Parsing encoding_decl");
3265 pickle_constructor
= NULL
;
3269 parser__pickler(PyObject
*self
, PyObject
*args
)
3271 NOTE(ARGUNUSED(self
))
3272 PyObject
*result
= NULL
;
3273 PyObject
*st
= NULL
;
3274 PyObject
*empty_dict
= NULL
;
3276 if (PyArg_ParseTuple(args
, "O!:_pickler", &PyST_Type
, &st
)) {
3280 if ((empty_dict
= PyDict_New()) == NULL
)
3282 if ((newargs
= Py_BuildValue("Oi", st
, 1)) == NULL
)
3284 tuple
= parser_st2tuple((PyST_Object
*)NULL
, newargs
, empty_dict
);
3285 if (tuple
!= NULL
) {
3286 result
= Py_BuildValue("O(O)", pickle_constructor
, tuple
);
3289 Py_DECREF(empty_dict
);
3293 Py_XDECREF(empty_dict
);
3299 /* Functions exported by this module. Most of this should probably
3300 * be converted into an ST object with methods, but that is better
3301 * done directly in Python, allowing subclasses to be created directly.
3302 * We'd really have to write a wrapper around it all anyway to allow
3305 static PyMethodDef parser_functions
[] = {
3306 {"ast2tuple", (PyCFunction
)parser_ast2tuple
, PUBLIC_METHOD_TYPE
,
3307 PyDoc_STR("Creates a tuple-tree representation of an ST.")},
3308 {"ast2list", (PyCFunction
)parser_ast2list
, PUBLIC_METHOD_TYPE
,
3309 PyDoc_STR("Creates a list-tree representation of an ST.")},
3310 {"compileast", (PyCFunction
)parser_compileast
,PUBLIC_METHOD_TYPE
,
3311 PyDoc_STR("Compiles an ST object into a code object.")},
3312 {"compilest", (PyCFunction
)parser_compilest
, PUBLIC_METHOD_TYPE
,
3313 PyDoc_STR("Compiles an ST object into a code object.")},
3314 {"expr", (PyCFunction
)parser_expr
, PUBLIC_METHOD_TYPE
,
3315 PyDoc_STR("Creates an ST object from an expression.")},
3316 {"isexpr", (PyCFunction
)parser_isexpr
, PUBLIC_METHOD_TYPE
,
3317 PyDoc_STR("Determines if an ST object was created from an expression.")},
3318 {"issuite", (PyCFunction
)parser_issuite
, PUBLIC_METHOD_TYPE
,
3319 PyDoc_STR("Determines if an ST object was created from a suite.")},
3320 {"suite", (PyCFunction
)parser_suite
, PUBLIC_METHOD_TYPE
,
3321 PyDoc_STR("Creates an ST object from a suite.")},
3322 {"sequence2ast", (PyCFunction
)parser_tuple2ast
, PUBLIC_METHOD_TYPE
,
3323 PyDoc_STR("Creates an ST object from a tree representation.")},
3324 {"sequence2st", (PyCFunction
)parser_tuple2st
, PUBLIC_METHOD_TYPE
,
3325 PyDoc_STR("Creates an ST object from a tree representation.")},
3326 {"st2tuple", (PyCFunction
)parser_st2tuple
, PUBLIC_METHOD_TYPE
,
3327 PyDoc_STR("Creates a tuple-tree representation of an ST.")},
3328 {"st2list", (PyCFunction
)parser_st2list
, PUBLIC_METHOD_TYPE
,
3329 PyDoc_STR("Creates a list-tree representation of an ST.")},
3330 {"tuple2ast", (PyCFunction
)parser_tuple2ast
, PUBLIC_METHOD_TYPE
,
3331 PyDoc_STR("Creates an ST object from a tree representation.")},
3332 {"tuple2st", (PyCFunction
)parser_tuple2st
, PUBLIC_METHOD_TYPE
,
3333 PyDoc_STR("Creates an ST object from a tree representation.")},
3335 /* private stuff: support pickle module */
3336 {"_pickler", (PyCFunction
)parser__pickler
, METH_VARARGS
,
3337 PyDoc_STR("Returns the pickle magic to allow ST objects to be pickled.")},
3339 {NULL
, NULL
, 0, NULL
}
3343 PyMODINIT_FUNC
initparser(void); /* supply a prototype */
3348 PyObject
*module
, *copyreg
;
3350 Py_TYPE(&PyST_Type
) = &PyType_Type
;
3351 module
= Py_InitModule("parser", parser_functions
);
3355 if (parser_error
== 0)
3356 parser_error
= PyErr_NewException("parser.ParserError", NULL
, NULL
);
3358 if (parser_error
== 0)
3359 /* caller will check PyErr_Occurred() */
3361 /* CAUTION: The code next used to skip bumping the refcount on
3362 * parser_error. That's a disaster if initparser() gets called more
3363 * than once. By incref'ing, we ensure that each module dict that
3364 * gets created owns its reference to the shared parser_error object,
3365 * and the file static parser_error vrbl owns a reference too.
3367 Py_INCREF(parser_error
);
3368 if (PyModule_AddObject(module
, "ParserError", parser_error
) != 0)
3371 Py_INCREF(&PyST_Type
);
3372 PyModule_AddObject(module
, "ASTType", (PyObject
*)&PyST_Type
);
3373 Py_INCREF(&PyST_Type
);
3374 PyModule_AddObject(module
, "STType", (PyObject
*)&PyST_Type
);
3376 PyModule_AddStringConstant(module
, "__copyright__",
3377 parser_copyright_string
);
3378 PyModule_AddStringConstant(module
, "__doc__",
3380 PyModule_AddStringConstant(module
, "__version__",
3381 parser_version_string
);
3383 /* Register to support pickling.
3384 * If this fails, the import of this module will fail because an
3385 * exception will be raised here; should we clear the exception?
3387 copyreg
= PyImport_ImportModuleNoBlock("copy_reg");
3388 if (copyreg
!= NULL
) {
3389 PyObject
*func
, *pickler
;
3391 func
= PyObject_GetAttrString(copyreg
, "pickle");
3392 pickle_constructor
= PyObject_GetAttrString(module
, "sequence2st");
3393 pickler
= PyObject_GetAttrString(module
, "_pickler");
3394 Py_XINCREF(pickle_constructor
);
3395 if ((func
!= NULL
) && (pickle_constructor
!= NULL
)
3396 && (pickler
!= NULL
)) {
3399 res
= PyObject_CallFunctionObjArgs(func
, &PyST_Type
, pickler
,
3400 pickle_constructor
, NULL
);
3404 Py_XDECREF(pickle_constructor
);
3405 Py_XDECREF(pickler
);