2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
7 #include "Python-ast.h"
18 /* Data structure used internally */
20 char *c_encoding
; /* source encoding */
21 int c_future_unicode
; /* __future__ unicode literals flag */
22 PyArena
*c_arena
; /* arena for allocating memeory */
23 const char *c_filename
; /* filename */
26 static asdl_seq
*seq_for_testlist(struct compiling
*, const node
*);
27 static expr_ty
ast_for_expr(struct compiling
*, const node
*);
28 static stmt_ty
ast_for_stmt(struct compiling
*, const node
*);
29 static asdl_seq
*ast_for_suite(struct compiling
*, const node
*);
30 static asdl_seq
*ast_for_exprlist(struct compiling
*, const node
*,
32 static expr_ty
ast_for_testlist(struct compiling
*, const node
*);
33 static stmt_ty
ast_for_classdef(struct compiling
*, const node
*, asdl_seq
*);
34 static expr_ty
ast_for_testlist_gexp(struct compiling
*, const node
*);
36 /* Note different signature for ast_for_call */
37 static expr_ty
ast_for_call(struct compiling
*, const node
*, expr_ty
);
39 static PyObject
*parsenumber(struct compiling
*, const char *);
40 static PyObject
*parsestr(struct compiling
*, const char *);
41 static PyObject
*parsestrplus(struct compiling
*, const node
*n
);
44 #define LINENO(n) ((n)->n_lineno)
48 new_identifier(const char* n
, PyArena
*arena
) {
49 PyObject
* id
= PyString_InternFromString(n
);
51 PyArena_AddPyObject(arena
, id
);
55 #define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
57 /* This routine provides an invalid object for the syntax error.
58 The outermost routine must unpack this error and create the
59 proper object. We do this so that we don't have to pass
60 the filename to everything function.
62 XXX Maybe we should just pass the filename...
66 ast_error(const node
*n
, const char *errstr
)
68 PyObject
*u
= Py_BuildValue("zi", errstr
, LINENO(n
));
71 PyErr_SetObject(PyExc_SyntaxError
, u
);
77 ast_error_finish(const char *filename
)
79 PyObject
*type
, *value
, *tback
, *errstr
, *loc
, *tmp
;
82 assert(PyErr_Occurred());
83 if (!PyErr_ExceptionMatches(PyExc_SyntaxError
))
86 PyErr_Fetch(&type
, &value
, &tback
);
87 errstr
= PyTuple_GetItem(value
, 0);
91 lineno
= PyInt_AsLong(PyTuple_GetItem(value
, 1));
98 loc
= PyErr_ProgramText(filename
, lineno
);
103 tmp
= Py_BuildValue("(zlOO)", filename
, lineno
, Py_None
, loc
);
109 value
= PyTuple_Pack(2, errstr
, tmp
);
114 PyErr_Restore(type
, value
, tback
);
118 ast_warn(struct compiling
*c
, const node
*n
, char *msg
)
120 if (PyErr_WarnExplicit(PyExc_SyntaxWarning
, msg
, c
->c_filename
, LINENO(n
),
122 /* if -Werr, change it to a SyntaxError */
123 if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SyntaxWarning
))
131 forbidden_check(struct compiling
*c
, const node
*n
, const char *x
)
133 if (!strcmp(x
, "None"))
134 return ast_error(n
, "cannot assign to None");
135 if (!strcmp(x
, "__debug__"))
136 return ast_error(n
, "cannot assign to __debug__");
137 if (Py_Py3kWarningFlag
) {
138 if (!(strcmp(x
, "True") && strcmp(x
, "False")) &&
139 !ast_warn(c
, n
, "assignment to True or False is forbidden in 3.x"))
141 if (!strcmp(x
, "nonlocal") &&
142 !ast_warn(c
, n
, "nonlocal is a keyword in 3.x"))
148 /* num_stmts() returns number of contained statements.
150 Use this routine to determine how big a sequence is needed for
151 the statements in a parse tree. Its raison d'etre is this bit of
154 stmt: simple_stmt | compound_stmt
155 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
157 A simple_stmt can contain multiple small_stmt elements joined
158 by semicolons. If the arg is a simple_stmt, the number of
159 small_stmt elements is returned.
163 num_stmts(const node
*n
)
170 if (TYPE(CHILD(n
, 0)) == NEWLINE
)
173 return num_stmts(CHILD(n
, 0));
176 for (i
= 0; i
< NCH(n
); i
++) {
178 if (TYPE(ch
) == stmt
)
183 return num_stmts(CHILD(n
, 0));
187 return NCH(n
) / 2; /* Divide by 2 to remove count of semi-colons */
190 return num_stmts(CHILD(n
, 0));
193 for (i
= 2; i
< (NCH(n
) - 1); i
++)
194 l
+= num_stmts(CHILD(n
, i
));
200 sprintf(buf
, "Non-statement found: %d %d",
209 /* Transform the CST rooted at node * to the appropriate AST
213 PyAST_FromNode(const node
*n
, PyCompilerFlags
*flags
, const char *filename
,
217 asdl_seq
*stmts
= NULL
;
222 if (flags
&& flags
->cf_flags
& PyCF_SOURCE_IS_UTF8
) {
223 c
.c_encoding
= "utf-8";
224 if (TYPE(n
) == encoding_decl
) {
225 ast_error(n
, "encoding declaration in Unicode string");
228 } else if (TYPE(n
) == encoding_decl
) {
229 c
.c_encoding
= STR(n
);
234 c
.c_future_unicode
= flags
&& flags
->cf_flags
& CO_FUTURE_UNICODE_LITERALS
;
236 c
.c_filename
= filename
;
241 stmts
= asdl_seq_new(num_stmts(n
), arena
);
244 for (i
= 0; i
< NCH(n
) - 1; i
++) {
246 if (TYPE(ch
) == NEWLINE
)
251 s
= ast_for_stmt(&c
, ch
);
254 asdl_seq_SET(stmts
, k
++, s
);
258 REQ(ch
, simple_stmt
);
259 for (j
= 0; j
< num
; j
++) {
260 s
= ast_for_stmt(&c
, CHILD(ch
, j
* 2));
263 asdl_seq_SET(stmts
, k
++, s
);
267 return Module(stmts
, arena
);
269 expr_ty testlist_ast
;
271 /* XXX Why not gen_for here? */
272 testlist_ast
= ast_for_testlist(&c
, CHILD(n
, 0));
275 return Expression(testlist_ast
, arena
);
278 if (TYPE(CHILD(n
, 0)) == NEWLINE
) {
279 stmts
= asdl_seq_new(1, arena
);
282 asdl_seq_SET(stmts
, 0, Pass(n
->n_lineno
, n
->n_col_offset
,
284 if (!asdl_seq_GET(stmts
, 0))
286 return Interactive(stmts
, arena
);
291 stmts
= asdl_seq_new(num
, arena
);
295 s
= ast_for_stmt(&c
, n
);
298 asdl_seq_SET(stmts
, 0, s
);
301 /* Only a simple_stmt can contain multiple statements. */
303 for (i
= 0; i
< NCH(n
); i
+= 2) {
304 if (TYPE(CHILD(n
, i
)) == NEWLINE
)
306 s
= ast_for_stmt(&c
, CHILD(n
, i
));
309 asdl_seq_SET(stmts
, i
/ 2, s
);
313 return Interactive(stmts
, arena
);
316 PyErr_Format(PyExc_SystemError
,
317 "invalid node %d for PyAST_FromNode", TYPE(n
));
321 ast_error_finish(filename
);
325 /* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
329 get_operator(const node
*n
)
355 return (operator_ty
)0;
359 /* Set the context ctx for expr_ty e, recursively traversing e.
361 Only sets context for expr kinds that "can appear in assignment context"
362 (according to ../Parser/Python.asdl). For other expr kinds, it sets
363 an appropriate syntax error and returns false.
367 set_context(struct compiling
*c
, expr_ty e
, expr_context_ty ctx
, const node
*n
)
370 /* If a particular expression type can't be used for assign / delete,
371 set expr_name to its name and an error message will be generated.
373 const char* expr_name
= NULL
;
375 /* The ast defines augmented store and load contexts, but the
376 implementation here doesn't actually use them. The code may be
377 a little more complex than necessary as a result. It also means
378 that expressions in an augmented assignment have a Store context.
379 Consider restructuring so that augmented assignment uses
382 assert(ctx
!= AugStore
&& ctx
!= AugLoad
);
386 if (ctx
== Store
&& !forbidden_check(c
, n
,
387 PyBytes_AS_STRING(e
->v
.Attribute
.attr
)))
389 e
->v
.Attribute
.ctx
= ctx
;
392 e
->v
.Subscript
.ctx
= ctx
;
395 if (ctx
== Store
&& !forbidden_check(c
, n
,
396 PyBytes_AS_STRING(e
->v
.Name
.id
)))
405 if (asdl_seq_LEN(e
->v
.Tuple
.elts
)) {
406 e
->v
.Tuple
.ctx
= ctx
;
414 expr_name
= "lambda";
417 expr_name
= "function call";
422 expr_name
= "operator";
424 case GeneratorExp_kind
:
425 expr_name
= "generator expression";
428 expr_name
= "yield expression";
431 expr_name
= "list comprehension";
436 expr_name
= "literal";
439 expr_name
= "comparison";
445 expr_name
= "conditional expression";
448 PyErr_Format(PyExc_SystemError
,
449 "unexpected expression in assignment %d (line %d)",
453 /* Check for error string set by switch */
456 PyOS_snprintf(buf
, sizeof(buf
),
458 ctx
== Store
? "assign to" : "delete",
460 return ast_error(n
, buf
);
463 /* If the LHS is a list or tuple, we need to set the assignment
464 context for all the contained elements.
469 for (i
= 0; i
< asdl_seq_LEN(s
); i
++) {
470 if (!set_context(c
, (expr_ty
)asdl_seq_GET(s
, i
), ctx
, n
))
478 ast_for_augassign(struct compiling
*c
, const node
*n
)
488 if (STR(n
)[1] == '/')
505 if (STR(n
)[1] == '*')
510 PyErr_Format(PyExc_SystemError
, "invalid augassign: %s", STR(n
));
511 return (operator_ty
)0;
516 ast_for_comp_op(struct compiling
*c
, const node
*n
)
518 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
529 case EQEQUAL
: /* == */
538 if (strcmp(STR(n
), "in") == 0)
540 if (strcmp(STR(n
), "is") == 0)
543 PyErr_Format(PyExc_SystemError
, "invalid comp_op: %s",
548 else if (NCH(n
) == 2) {
549 /* handle "not in" and "is not" */
550 switch (TYPE(CHILD(n
, 0))) {
552 if (strcmp(STR(CHILD(n
, 1)), "in") == 0)
554 if (strcmp(STR(CHILD(n
, 0)), "is") == 0)
557 PyErr_Format(PyExc_SystemError
, "invalid comp_op: %s %s",
558 STR(CHILD(n
, 0)), STR(CHILD(n
, 1)));
562 PyErr_Format(PyExc_SystemError
, "invalid comp_op: has %d children",
568 seq_for_testlist(struct compiling
*c
, const node
*n
)
570 /* testlist: test (',' test)* [','] */
574 assert(TYPE(n
) == testlist
||
575 TYPE(n
) == listmaker
||
576 TYPE(n
) == testlist_gexp
||
577 TYPE(n
) == testlist_safe
||
578 TYPE(n
) == testlist1
);
580 seq
= asdl_seq_new((NCH(n
) + 1) / 2, c
->c_arena
);
584 for (i
= 0; i
< NCH(n
); i
+= 2) {
585 assert(TYPE(CHILD(n
, i
)) == test
|| TYPE(CHILD(n
, i
)) == old_test
);
587 expression
= ast_for_expr(c
, CHILD(n
, i
));
591 assert(i
/ 2 < seq
->size
);
592 asdl_seq_SET(seq
, i
/ 2, expression
);
598 compiler_complex_args(struct compiling
*c
, const node
*n
)
600 int i
, len
= (NCH(n
) + 1) / 2;
602 asdl_seq
*args
= asdl_seq_new(len
, c
->c_arena
);
606 /* fpdef: NAME | '(' fplist ')'
607 fplist: fpdef (',' fpdef)* [',']
610 for (i
= 0; i
< len
; i
++) {
612 const node
*fpdef_node
= CHILD(n
, 2*i
);
616 /* fpdef_node is either a NAME or an fplist */
617 child
= CHILD(fpdef_node
, 0);
618 if (TYPE(child
) == NAME
) {
619 if (!forbidden_check(c
, n
, STR(child
)))
621 arg_id
= NEW_IDENTIFIER(child
);
624 arg
= Name(arg_id
, Store
, LINENO(child
), child
->n_col_offset
,
628 assert(TYPE(fpdef_node
) == fpdef
);
629 /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */
630 child
= CHILD(fpdef_node
, 1);
631 assert(TYPE(child
) == fplist
);
632 /* NCH == 1 means we have (x), we need to elide the extra parens */
633 if (NCH(child
) == 1) {
634 fpdef_node
= CHILD(child
, 0);
635 assert(TYPE(fpdef_node
) == fpdef
);
638 arg
= compiler_complex_args(c
, child
);
640 asdl_seq_SET(args
, i
, arg
);
643 result
= Tuple(args
, Store
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
644 if (!set_context(c
, result
, Store
, n
))
650 /* Create AST for argument list. */
653 ast_for_arguments(struct compiling
*c
, const node
*n
)
655 /* parameters: '(' [varargslist] ')'
656 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
657 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
659 int i
, j
, k
, n_args
= 0, n_defaults
= 0, found_default
= 0;
660 asdl_seq
*args
, *defaults
;
661 identifier vararg
= NULL
, kwarg
= NULL
;
664 if (TYPE(n
) == parameters
) {
665 if (NCH(n
) == 2) /* () as argument list */
666 return arguments(NULL
, NULL
, NULL
, NULL
, c
->c_arena
);
671 /* first count the number of normal args & defaults */
672 for (i
= 0; i
< NCH(n
); i
++) {
674 if (TYPE(ch
) == fpdef
)
676 if (TYPE(ch
) == EQUAL
)
679 args
= (n_args
? asdl_seq_new(n_args
, c
->c_arena
) : NULL
);
681 return NULL
; /* Don't need to goto error; no objects allocated */
682 defaults
= (n_defaults
? asdl_seq_new(n_defaults
, c
->c_arena
) : NULL
);
683 if (!defaults
&& n_defaults
)
684 return NULL
; /* Don't need to goto error; no objects allocated */
686 /* fpdef: NAME | '(' fplist ')'
687 fplist: fpdef (',' fpdef)* [',']
690 j
= 0; /* index for defaults */
691 k
= 0; /* index for args */
697 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
698 anything other than EQUAL or a comma? */
699 /* XXX Should NCH(n) check be made a separate check? */
700 if (i
+ 1 < NCH(n
) && TYPE(CHILD(n
, i
+ 1)) == EQUAL
) {
701 expr_ty expression
= ast_for_expr(c
, CHILD(n
, i
+ 2));
704 assert(defaults
!= NULL
);
705 asdl_seq_SET(defaults
, j
++, expression
);
709 else if (found_default
) {
711 "non-default argument follows default argument");
716 /* def foo((x)): is not complex, special case. */
718 /* We have complex arguments, setup for unpacking. */
719 if (Py_Py3kWarningFlag
&& !ast_warn(c
, ch
,
720 "tuple parameter unpacking has been removed in 3.x"))
722 asdl_seq_SET(args
, k
++, compiler_complex_args(c
, ch
));
723 if (!asdl_seq_GET(args
, k
-1))
726 /* def foo((x)): setup for checking NAME below. */
727 /* Loop because there can be many parens and tuple
728 unpacking mixed in. */
730 assert(TYPE(ch
) == fpdef
);
734 if (TYPE(CHILD(ch
, 0)) == NAME
) {
737 if (!forbidden_check(c
, n
, STR(CHILD(ch
, 0))))
739 id
= NEW_IDENTIFIER(CHILD(ch
, 0));
742 name
= Name(id
, Param
, LINENO(ch
), ch
->n_col_offset
,
746 asdl_seq_SET(args
, k
++, name
);
749 i
+= 2; /* the name and the comma */
752 if (!forbidden_check(c
, CHILD(n
, i
+1), STR(CHILD(n
, i
+1))))
754 vararg
= NEW_IDENTIFIER(CHILD(n
, i
+1));
760 if (!forbidden_check(c
, CHILD(n
, i
+1), STR(CHILD(n
, i
+1))))
762 kwarg
= NEW_IDENTIFIER(CHILD(n
, i
+1));
768 PyErr_Format(PyExc_SystemError
,
769 "unexpected node in varargslist: %d @ %d",
775 return arguments(args
, vararg
, kwarg
, defaults
, c
->c_arena
);
784 ast_for_dotted_name(struct compiling
*c
, const node
*n
)
788 int lineno
, col_offset
;
794 col_offset
= n
->n_col_offset
;
796 id
= NEW_IDENTIFIER(CHILD(n
, 0));
799 e
= Name(id
, Load
, lineno
, col_offset
, c
->c_arena
);
803 for (i
= 2; i
< NCH(n
); i
+=2) {
804 id
= NEW_IDENTIFIER(CHILD(n
, i
));
807 e
= Attribute(e
, id
, Load
, lineno
, col_offset
, c
->c_arena
);
816 ast_for_decorator(struct compiling
*c
, const node
*n
)
818 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
823 REQ(CHILD(n
, 0), AT
);
824 REQ(RCHILD(n
, -1), NEWLINE
);
826 name_expr
= ast_for_dotted_name(c
, CHILD(n
, 1));
830 if (NCH(n
) == 3) { /* No arguments */
834 else if (NCH(n
) == 5) { /* Call with no arguments */
835 d
= Call(name_expr
, NULL
, NULL
, NULL
, NULL
, LINENO(n
),
836 n
->n_col_offset
, c
->c_arena
);
842 d
= ast_for_call(c
, CHILD(n
, 3), name_expr
);
852 ast_for_decorators(struct compiling
*c
, const node
*n
)
854 asdl_seq
* decorator_seq
;
859 decorator_seq
= asdl_seq_new(NCH(n
), c
->c_arena
);
863 for (i
= 0; i
< NCH(n
); i
++) {
864 d
= ast_for_decorator(c
, CHILD(n
, i
));
867 asdl_seq_SET(decorator_seq
, i
, d
);
869 return decorator_seq
;
873 ast_for_funcdef(struct compiling
*c
, const node
*n
, asdl_seq
*decorator_seq
)
875 /* funcdef: 'def' NAME parameters ':' suite */
883 name
= NEW_IDENTIFIER(CHILD(n
, name_i
));
886 else if (!forbidden_check(c
, CHILD(n
, name_i
), STR(CHILD(n
, name_i
))))
888 args
= ast_for_arguments(c
, CHILD(n
, name_i
+ 1));
891 body
= ast_for_suite(c
, CHILD(n
, name_i
+ 3));
895 return FunctionDef(name
, args
, body
, decorator_seq
, LINENO(n
),
896 n
->n_col_offset
, c
->c_arena
);
900 ast_for_decorated(struct compiling
*c
, const node
*n
)
902 /* decorated: decorators (classdef | funcdef) */
903 stmt_ty thing
= NULL
;
904 asdl_seq
*decorator_seq
= NULL
;
908 decorator_seq
= ast_for_decorators(c
, CHILD(n
, 0));
912 assert(TYPE(CHILD(n
, 1)) == funcdef
||
913 TYPE(CHILD(n
, 1)) == classdef
);
915 if (TYPE(CHILD(n
, 1)) == funcdef
) {
916 thing
= ast_for_funcdef(c
, CHILD(n
, 1), decorator_seq
);
917 } else if (TYPE(CHILD(n
, 1)) == classdef
) {
918 thing
= ast_for_classdef(c
, CHILD(n
, 1), decorator_seq
);
920 /* we count the decorators in when talking about the class' or
921 function's line number */
923 thing
->lineno
= LINENO(n
);
924 thing
->col_offset
= n
->n_col_offset
;
930 ast_for_lambdef(struct compiling
*c
, const node
*n
)
932 /* lambdef: 'lambda' [varargslist] ':' test */
937 args
= arguments(NULL
, NULL
, NULL
, NULL
, c
->c_arena
);
940 expression
= ast_for_expr(c
, CHILD(n
, 2));
945 args
= ast_for_arguments(c
, CHILD(n
, 1));
948 expression
= ast_for_expr(c
, CHILD(n
, 3));
953 return Lambda(args
, expression
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
957 ast_for_ifexpr(struct compiling
*c
, const node
*n
)
959 /* test: or_test 'if' or_test 'else' test */
960 expr_ty expression
, body
, orelse
;
963 body
= ast_for_expr(c
, CHILD(n
, 0));
966 expression
= ast_for_expr(c
, CHILD(n
, 2));
969 orelse
= ast_for_expr(c
, CHILD(n
, 4));
972 return IfExp(expression
, body
, orelse
, LINENO(n
), n
->n_col_offset
,
976 /* XXX(nnorwitz): the listcomp and genexpr code should be refactored
977 so there is only a single version. Possibly for loops can also re-use
981 /* Count the number of 'for' loop in a list comprehension.
983 Helper for ast_for_listcomp().
987 count_list_fors(struct compiling
*c
, const node
*n
)
990 node
*ch
= CHILD(n
, 1);
1002 if (TYPE(ch
) == list_for
)
1003 goto count_list_for
;
1004 else if (TYPE(ch
) == list_if
) {
1007 goto count_list_iter
;
1013 /* Should never be reached */
1014 PyErr_SetString(PyExc_SystemError
, "logic error in count_list_fors");
1018 /* Count the number of 'if' statements in a list comprehension.
1020 Helper for ast_for_listcomp().
1024 count_list_ifs(struct compiling
*c
, const node
*n
)
1030 if (TYPE(CHILD(n
, 0)) == list_for
)
1038 goto count_list_iter
;
1042 ast_for_listcomp(struct compiling
*c
, const node
*n
)
1044 /* listmaker: test ( list_for | (',' test)* [','] )
1045 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
1046 list_iter: list_for | list_if
1047 list_if: 'if' test [list_iter]
1048 testlist_safe: test [(',' test)+ [',']]
1051 asdl_seq
*listcomps
;
1058 elt
= ast_for_expr(c
, CHILD(n
, 0));
1062 n_fors
= count_list_fors(c
, n
);
1066 listcomps
= asdl_seq_new(n_fors
, c
->c_arena
);
1071 for (i
= 0; i
< n_fors
; i
++) {
1072 comprehension_ty lc
;
1079 for_ch
= CHILD(ch
, 1);
1080 t
= ast_for_exprlist(c
, for_ch
, Store
);
1083 expression
= ast_for_testlist(c
, CHILD(ch
, 3));
1087 /* Check the # of children rather than the length of t, since
1088 [x for x, in ... ] has 1 element in t, but still requires a Tuple.
1090 if (NCH(for_ch
) == 1)
1091 lc
= comprehension((expr_ty
)asdl_seq_GET(t
, 0), expression
, NULL
,
1094 lc
= comprehension(Tuple(t
, Store
, LINENO(ch
), ch
->n_col_offset
,
1096 expression
, NULL
, c
->c_arena
);
1103 expr_ty list_for_expr
;
1106 n_ifs
= count_list_ifs(c
, ch
);
1110 ifs
= asdl_seq_new(n_ifs
, c
->c_arena
);
1114 for (j
= 0; j
< n_ifs
; j
++) {
1119 list_for_expr
= ast_for_expr(c
, CHILD(ch
, 1));
1123 asdl_seq_SET(ifs
, j
, list_for_expr
);
1127 /* on exit, must guarantee that ch is a list_for */
1128 if (TYPE(ch
) == list_iter
)
1132 asdl_seq_SET(listcomps
, i
, lc
);
1135 return ListComp(elt
, listcomps
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1138 /* Count the number of 'for' loops in a generator expression.
1140 Helper for ast_for_genexp().
1144 count_gen_fors(struct compiling
*c
, const node
*n
)
1147 node
*ch
= CHILD(n
, 1);
1159 if (TYPE(ch
) == gen_for
)
1161 else if (TYPE(ch
) == gen_if
) {
1164 goto count_gen_iter
;
1170 /* Should never be reached */
1171 PyErr_SetString(PyExc_SystemError
,
1172 "logic error in count_gen_fors");
1176 /* Count the number of 'if' statements in a generator expression.
1178 Helper for ast_for_genexp().
1182 count_gen_ifs(struct compiling
*c
, const node
*n
)
1188 if (TYPE(CHILD(n
, 0)) == gen_for
)
1199 /* TODO(jhylton): Combine with list comprehension code? */
1201 ast_for_genexp(struct compiling
*c
, const node
*n
)
1203 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
1204 argument: [test '='] test [gen_for] # Really [keyword '='] test */
1210 assert(TYPE(n
) == (testlist_gexp
) || TYPE(n
) == (argument
));
1213 elt
= ast_for_expr(c
, CHILD(n
, 0));
1217 n_fors
= count_gen_fors(c
, n
);
1221 genexps
= asdl_seq_new(n_fors
, c
->c_arena
);
1226 for (i
= 0; i
< n_fors
; i
++) {
1227 comprehension_ty ge
;
1234 for_ch
= CHILD(ch
, 1);
1235 t
= ast_for_exprlist(c
, for_ch
, Store
);
1238 expression
= ast_for_expr(c
, CHILD(ch
, 3));
1242 /* Check the # of children rather than the length of t, since
1243 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1244 if (NCH(for_ch
) == 1)
1245 ge
= comprehension((expr_ty
)asdl_seq_GET(t
, 0), expression
,
1248 ge
= comprehension(Tuple(t
, Store
, LINENO(ch
), ch
->n_col_offset
,
1250 expression
, NULL
, c
->c_arena
);
1260 n_ifs
= count_gen_ifs(c
, ch
);
1264 ifs
= asdl_seq_new(n_ifs
, c
->c_arena
);
1268 for (j
= 0; j
< n_ifs
; j
++) {
1273 expression
= ast_for_expr(c
, CHILD(ch
, 1));
1276 asdl_seq_SET(ifs
, j
, expression
);
1280 /* on exit, must guarantee that ch is a gen_for */
1281 if (TYPE(ch
) == gen_iter
)
1285 asdl_seq_SET(genexps
, i
, ge
);
1288 return GeneratorExp(elt
, genexps
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1292 ast_for_atom(struct compiling
*c
, const node
*n
)
1294 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1295 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1297 node
*ch
= CHILD(n
, 0);
1301 /* All names start in Load context, but may later be
1303 PyObject
*name
= NEW_IDENTIFIER(ch
);
1306 return Name(name
, Load
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1309 PyObject
*str
= parsestrplus(c
, n
);
1311 #ifdef Py_USING_UNICODE
1312 if (PyErr_ExceptionMatches(PyExc_UnicodeError
)){
1313 PyObject
*type
, *value
, *tback
, *errstr
;
1314 PyErr_Fetch(&type
, &value
, &tback
);
1315 errstr
= PyObject_Str(value
);
1319 s
= PyString_AsString(errstr
);
1320 PyOS_snprintf(buf
, sizeof(buf
), "(unicode error) %s", s
);
1324 ast_error(n
, "(unicode error) unknown error");
1333 PyArena_AddPyObject(c
->c_arena
, str
);
1334 return Str(str
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1337 PyObject
*pynum
= parsenumber(c
, STR(ch
));
1341 PyArena_AddPyObject(c
->c_arena
, pynum
);
1342 return Num(pynum
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1344 case LPAR
: /* some parenthesized expressions */
1347 if (TYPE(ch
) == RPAR
)
1348 return Tuple(NULL
, Load
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1350 if (TYPE(ch
) == yield_expr
)
1351 return ast_for_expr(c
, ch
);
1353 return ast_for_testlist_gexp(c
, ch
);
1354 case LSQB
: /* list (or list comprehension) */
1357 if (TYPE(ch
) == RSQB
)
1358 return List(NULL
, Load
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1361 if (NCH(ch
) == 1 || TYPE(CHILD(ch
, 1)) == COMMA
) {
1362 asdl_seq
*elts
= seq_for_testlist(c
, ch
);
1366 return List(elts
, Load
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1369 return ast_for_listcomp(c
, ch
);
1371 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1373 asdl_seq
*keys
, *values
;
1376 size
= (NCH(ch
) + 1) / 4; /* +1 in case no trailing comma */
1377 keys
= asdl_seq_new(size
, c
->c_arena
);
1381 values
= asdl_seq_new(size
, c
->c_arena
);
1385 for (i
= 0; i
< NCH(ch
); i
+= 4) {
1388 expression
= ast_for_expr(c
, CHILD(ch
, i
));
1392 asdl_seq_SET(keys
, i
/ 4, expression
);
1394 expression
= ast_for_expr(c
, CHILD(ch
, i
+ 2));
1398 asdl_seq_SET(values
, i
/ 4, expression
);
1400 return Dict(keys
, values
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1402 case BACKQUOTE
: { /* repr */
1404 if (Py_Py3kWarningFlag
&&
1405 !ast_warn(c
, n
, "backquote not supported in 3.x; use repr()"))
1407 expression
= ast_for_testlist(c
, CHILD(n
, 1));
1411 return Repr(expression
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1414 PyErr_Format(PyExc_SystemError
, "unhandled atom %d", TYPE(ch
));
1420 ast_for_slice(struct compiling
*c
, const node
*n
)
1423 expr_ty lower
= NULL
, upper
= NULL
, step
= NULL
;
1428 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1432 if (TYPE(ch
) == DOT
)
1433 return Ellipsis(c
->c_arena
);
1435 if (NCH(n
) == 1 && TYPE(ch
) == test
) {
1436 /* 'step' variable hold no significance in terms of being used over
1438 step
= ast_for_expr(c
, ch
);
1442 return Index(step
, c
->c_arena
);
1445 if (TYPE(ch
) == test
) {
1446 lower
= ast_for_expr(c
, ch
);
1451 /* If there's an upper bound it's in the second or third position. */
1452 if (TYPE(ch
) == COLON
) {
1454 node
*n2
= CHILD(n
, 1);
1456 if (TYPE(n2
) == test
) {
1457 upper
= ast_for_expr(c
, n2
);
1462 } else if (NCH(n
) > 2) {
1463 node
*n2
= CHILD(n
, 2);
1465 if (TYPE(n2
) == test
) {
1466 upper
= ast_for_expr(c
, n2
);
1472 ch
= CHILD(n
, NCH(n
) - 1);
1473 if (TYPE(ch
) == sliceop
) {
1476 if (TYPE(ch
) == test
) {
1477 step
= ast_for_expr(c
, ch
);
1484 return Slice(lower
, upper
, step
, c
->c_arena
);
1488 ast_for_binop(struct compiling
*c
, const node
*n
)
1490 /* Must account for a sequence of expressions.
1491 How should A op B op C by represented?
1492 BinOp(BinOp(A, op, B), op, C).
1496 expr_ty expr1
, expr2
, result
;
1497 operator_ty newoperator
;
1499 expr1
= ast_for_expr(c
, CHILD(n
, 0));
1503 expr2
= ast_for_expr(c
, CHILD(n
, 2));
1507 newoperator
= get_operator(CHILD(n
, 1));
1511 result
= BinOp(expr1
, newoperator
, expr2
, LINENO(n
), n
->n_col_offset
,
1516 nops
= (NCH(n
) - 1) / 2;
1517 for (i
= 1; i
< nops
; i
++) {
1518 expr_ty tmp_result
, tmp
;
1519 const node
* next_oper
= CHILD(n
, i
* 2 + 1);
1521 newoperator
= get_operator(next_oper
);
1525 tmp
= ast_for_expr(c
, CHILD(n
, i
* 2 + 2));
1529 tmp_result
= BinOp(result
, newoperator
, tmp
,
1530 LINENO(next_oper
), next_oper
->n_col_offset
,
1534 result
= tmp_result
;
1540 ast_for_trailer(struct compiling
*c
, const node
*n
, expr_ty left_expr
)
1542 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1543 subscriptlist: subscript (',' subscript)* [',']
1544 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1547 if (TYPE(CHILD(n
, 0)) == LPAR
) {
1549 return Call(left_expr
, NULL
, NULL
, NULL
, NULL
, LINENO(n
),
1550 n
->n_col_offset
, c
->c_arena
);
1552 return ast_for_call(c
, CHILD(n
, 1), left_expr
);
1554 else if (TYPE(CHILD(n
, 0)) == DOT
) {
1555 PyObject
*attr_id
= NEW_IDENTIFIER(CHILD(n
, 1));
1558 return Attribute(left_expr
, attr_id
, Load
,
1559 LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1562 REQ(CHILD(n
, 0), LSQB
);
1563 REQ(CHILD(n
, 2), RSQB
);
1566 slice_ty slc
= ast_for_slice(c
, CHILD(n
, 0));
1569 return Subscript(left_expr
, slc
, Load
, LINENO(n
), n
->n_col_offset
,
1573 /* The grammar is ambiguous here. The ambiguity is resolved
1574 by treating the sequence as a tuple literal if there are
1581 asdl_seq
*slices
, *elts
;
1582 slices
= asdl_seq_new((NCH(n
) + 1) / 2, c
->c_arena
);
1585 for (j
= 0; j
< NCH(n
); j
+= 2) {
1586 slc
= ast_for_slice(c
, CHILD(n
, j
));
1589 if (slc
->kind
!= Index_kind
)
1591 asdl_seq_SET(slices
, j
/ 2, slc
);
1594 return Subscript(left_expr
, ExtSlice(slices
, c
->c_arena
),
1595 Load
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1597 /* extract Index values and put them in a Tuple */
1598 elts
= asdl_seq_new(asdl_seq_LEN(slices
), c
->c_arena
);
1601 for (j
= 0; j
< asdl_seq_LEN(slices
); ++j
) {
1602 slc
= (slice_ty
)asdl_seq_GET(slices
, j
);
1603 assert(slc
->kind
== Index_kind
&& slc
->v
.Index
.value
);
1604 asdl_seq_SET(elts
, j
, slc
->v
.Index
.value
);
1606 e
= Tuple(elts
, Load
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1609 return Subscript(left_expr
, Index(e
, c
->c_arena
),
1610 Load
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1616 ast_for_factor(struct compiling
*c
, const node
*n
)
1618 node
*pfactor
, *ppower
, *patom
, *pnum
;
1621 /* If the unary - operator is applied to a constant, don't generate
1622 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1623 constant. The peephole optimizer already does something like
1624 this but it doesn't handle the case where the constant is
1625 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1628 if (TYPE(CHILD(n
, 0)) == MINUS
&&
1630 TYPE((pfactor
= CHILD(n
, 1))) == factor
&&
1631 NCH(pfactor
) == 1 &&
1632 TYPE((ppower
= CHILD(pfactor
, 0))) == power
&&
1634 TYPE((patom
= CHILD(ppower
, 0))) == atom
&&
1635 TYPE((pnum
= CHILD(patom
, 0))) == NUMBER
) {
1636 char *s
= PyObject_MALLOC(strlen(STR(pnum
)) + 2);
1640 strcpy(s
+ 1, STR(pnum
));
1641 PyObject_FREE(STR(pnum
));
1643 return ast_for_atom(c
, patom
);
1646 expression
= ast_for_expr(c
, CHILD(n
, 1));
1650 switch (TYPE(CHILD(n
, 0))) {
1652 return UnaryOp(UAdd
, expression
, LINENO(n
), n
->n_col_offset
,
1655 return UnaryOp(USub
, expression
, LINENO(n
), n
->n_col_offset
,
1658 return UnaryOp(Invert
, expression
, LINENO(n
),
1659 n
->n_col_offset
, c
->c_arena
);
1661 PyErr_Format(PyExc_SystemError
, "unhandled factor: %d",
1667 ast_for_power(struct compiling
*c
, const node
*n
)
1669 /* power: atom trailer* ('**' factor)*
1674 e
= ast_for_atom(c
, CHILD(n
, 0));
1679 for (i
= 1; i
< NCH(n
); i
++) {
1680 node
*ch
= CHILD(n
, i
);
1681 if (TYPE(ch
) != trailer
)
1683 tmp
= ast_for_trailer(c
, ch
, e
);
1686 tmp
->lineno
= e
->lineno
;
1687 tmp
->col_offset
= e
->col_offset
;
1690 if (TYPE(CHILD(n
, NCH(n
) - 1)) == factor
) {
1691 expr_ty f
= ast_for_expr(c
, CHILD(n
, NCH(n
) - 1));
1694 tmp
= BinOp(e
, Pow
, f
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1702 /* Do not name a variable 'expr'! Will cause a compile error.
1706 ast_for_expr(struct compiling
*c
, const node
*n
)
1708 /* handle the full range of simple expressions
1709 test: or_test ['if' or_test 'else' test] | lambdef
1710 or_test: and_test ('or' and_test)*
1711 and_test: not_test ('and' not_test)*
1712 not_test: 'not' not_test | comparison
1713 comparison: expr (comp_op expr)*
1714 expr: xor_expr ('|' xor_expr)*
1715 xor_expr: and_expr ('^' and_expr)*
1716 and_expr: shift_expr ('&' shift_expr)*
1717 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1718 arith_expr: term (('+'|'-') term)*
1719 term: factor (('*'|'/'|'%'|'//') factor)*
1720 factor: ('+'|'-'|'~') factor | power
1721 power: atom trailer* ('**' factor)*
1723 As well as modified versions that exist for backward compatibility,
1724 to explicitly allow:
1725 [ x for x in lambda: 0, lambda: 1 ]
1726 (which would be ambiguous without these extra rules)
1728 old_test: or_test | old_lambdef
1729 old_lambdef: 'lambda' [vararglist] ':' old_test
1740 if (TYPE(CHILD(n
, 0)) == lambdef
||
1741 TYPE(CHILD(n
, 0)) == old_lambdef
)
1742 return ast_for_lambdef(c
, CHILD(n
, 0));
1743 else if (NCH(n
) > 1)
1744 return ast_for_ifexpr(c
, n
);
1752 seq
= asdl_seq_new((NCH(n
) + 1) / 2, c
->c_arena
);
1755 for (i
= 0; i
< NCH(n
); i
+= 2) {
1756 expr_ty e
= ast_for_expr(c
, CHILD(n
, i
));
1759 asdl_seq_SET(seq
, i
/ 2, e
);
1761 if (!strcmp(STR(CHILD(n
, 1)), "and"))
1762 return BoolOp(And
, seq
, LINENO(n
), n
->n_col_offset
,
1764 assert(!strcmp(STR(CHILD(n
, 1)), "or"));
1765 return BoolOp(Or
, seq
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1772 expr_ty expression
= ast_for_expr(c
, CHILD(n
, 1));
1776 return UnaryOp(Not
, expression
, LINENO(n
), n
->n_col_offset
,
1788 ops
= asdl_int_seq_new(NCH(n
) / 2, c
->c_arena
);
1791 cmps
= asdl_seq_new(NCH(n
) / 2, c
->c_arena
);
1795 for (i
= 1; i
< NCH(n
); i
+= 2) {
1796 cmpop_ty newoperator
;
1798 newoperator
= ast_for_comp_op(c
, CHILD(n
, i
));
1803 expression
= ast_for_expr(c
, CHILD(n
, i
+ 1));
1808 asdl_seq_SET(ops
, i
/ 2, newoperator
);
1809 asdl_seq_SET(cmps
, i
/ 2, expression
);
1811 expression
= ast_for_expr(c
, CHILD(n
, 0));
1816 return Compare(expression
, ops
, cmps
, LINENO(n
),
1817 n
->n_col_offset
, c
->c_arena
);
1821 /* The next five cases all handle BinOps. The main body of code
1822 is the same in each case, but the switch turned inside out to
1823 reuse the code for each type of operator.
1835 return ast_for_binop(c
, n
);
1839 exp
= ast_for_testlist(c
, CHILD(n
, 1));
1843 return Yield(exp
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
1850 return ast_for_factor(c
, n
);
1852 return ast_for_power(c
, n
);
1854 PyErr_Format(PyExc_SystemError
, "unhandled expr: %d", TYPE(n
));
1857 /* should never get here unless if error is set */
1862 ast_for_call(struct compiling
*c
, const node
*n
, expr_ty func
)
1865 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1867 argument: [test '='] test [gen_for] # Really [keyword '='] test
1870 int i
, nargs
, nkeywords
, ngens
;
1873 expr_ty vararg
= NULL
, kwarg
= NULL
;
1880 for (i
= 0; i
< NCH(n
); i
++) {
1881 node
*ch
= CHILD(n
, i
);
1882 if (TYPE(ch
) == argument
) {
1885 else if (TYPE(CHILD(ch
, 1)) == gen_for
)
1891 if (ngens
> 1 || (ngens
&& (nargs
|| nkeywords
))) {
1892 ast_error(n
, "Generator expression must be parenthesized "
1893 "if not sole argument");
1897 if (nargs
+ nkeywords
+ ngens
> 255) {
1898 ast_error(n
, "more than 255 arguments");
1902 args
= asdl_seq_new(nargs
+ ngens
, c
->c_arena
);
1905 keywords
= asdl_seq_new(nkeywords
, c
->c_arena
);
1910 for (i
= 0; i
< NCH(n
); i
++) {
1911 node
*ch
= CHILD(n
, i
);
1912 if (TYPE(ch
) == argument
) {
1916 ast_error(CHILD(ch
, 0),
1917 "non-keyword arg after keyword arg");
1921 ast_error(CHILD(ch
, 0),
1922 "only named arguments may follow *expression");
1925 e
= ast_for_expr(c
, CHILD(ch
, 0));
1928 asdl_seq_SET(args
, nargs
++, e
);
1930 else if (TYPE(CHILD(ch
, 1)) == gen_for
) {
1931 e
= ast_for_genexp(c
, ch
);
1934 asdl_seq_SET(args
, nargs
++, e
);
1942 /* CHILD(ch, 0) is test, but must be an identifier? */
1943 e
= ast_for_expr(c
, CHILD(ch
, 0));
1946 /* f(lambda x: x[0] = 3) ends up getting parsed with
1947 * LHS test = lambda x: x[0], and RHS test = 3.
1948 * SF bug 132313 points out that complaining about a keyword
1949 * then is very confusing.
1951 if (e
->kind
== Lambda_kind
) {
1952 ast_error(CHILD(ch
, 0),
1953 "lambda cannot contain assignment");
1955 } else if (e
->kind
!= Name_kind
) {
1956 ast_error(CHILD(ch
, 0), "keyword can't be an expression");
1960 if (!forbidden_check(c
, CHILD(ch
, 0), PyBytes_AS_STRING(key
)))
1962 for (k
= 0; k
< nkeywords
; k
++) {
1963 tmp
= PyString_AS_STRING(
1964 ((keyword_ty
)asdl_seq_GET(keywords
, k
))->arg
);
1965 if (!strcmp(tmp
, PyString_AS_STRING(key
))) {
1966 ast_error(CHILD(ch
, 0), "keyword argument repeated");
1970 e
= ast_for_expr(c
, CHILD(ch
, 2));
1973 kw
= keyword(key
, e
, c
->c_arena
);
1976 asdl_seq_SET(keywords
, nkeywords
++, kw
);
1979 else if (TYPE(ch
) == STAR
) {
1980 vararg
= ast_for_expr(c
, CHILD(n
, i
+1));
1985 else if (TYPE(ch
) == DOUBLESTAR
) {
1986 kwarg
= ast_for_expr(c
, CHILD(n
, i
+1));
1993 return Call(func
, args
, keywords
, vararg
, kwarg
, func
->lineno
,
1994 func
->col_offset
, c
->c_arena
);
1998 ast_for_testlist(struct compiling
*c
, const node
* n
)
2000 /* testlist_gexp: test (',' test)* [','] */
2001 /* testlist: test (',' test)* [','] */
2002 /* testlist_safe: test (',' test)+ [','] */
2003 /* testlist1: test (',' test)* */
2005 if (TYPE(n
) == testlist_gexp
) {
2007 assert(TYPE(CHILD(n
, 1)) != gen_for
);
2010 assert(TYPE(n
) == testlist
||
2011 TYPE(n
) == testlist_safe
||
2012 TYPE(n
) == testlist1
);
2015 return ast_for_expr(c
, CHILD(n
, 0));
2017 asdl_seq
*tmp
= seq_for_testlist(c
, n
);
2020 return Tuple(tmp
, Load
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2025 ast_for_testlist_gexp(struct compiling
*c
, const node
* n
)
2027 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2028 /* argument: test [ gen_for ] */
2029 assert(TYPE(n
) == testlist_gexp
|| TYPE(n
) == argument
);
2030 if (NCH(n
) > 1 && TYPE(CHILD(n
, 1)) == gen_for
)
2031 return ast_for_genexp(c
, n
);
2032 return ast_for_testlist(c
, n
);
2035 /* like ast_for_testlist() but returns a sequence */
2037 ast_for_class_bases(struct compiling
*c
, const node
* n
)
2039 /* testlist: test (',' test)* [','] */
2044 asdl_seq
*bases
= asdl_seq_new(1, c
->c_arena
);
2047 base
= ast_for_expr(c
, CHILD(n
, 0));
2050 asdl_seq_SET(bases
, 0, base
);
2054 return seq_for_testlist(c
, n
);
2058 ast_for_expr_stmt(struct compiling
*c
, const node
*n
)
2061 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2062 | ('=' (yield_expr|testlist))*)
2063 testlist: test (',' test)* [',']
2064 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
2065 | '<<=' | '>>=' | '**=' | '//='
2066 test: ... here starts the operator precendence dance
2070 expr_ty e
= ast_for_testlist(c
, CHILD(n
, 0));
2074 return Expr(e
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2076 else if (TYPE(CHILD(n
, 1)) == augassign
) {
2077 expr_ty expr1
, expr2
;
2078 operator_ty newoperator
;
2079 node
*ch
= CHILD(n
, 0);
2081 expr1
= ast_for_testlist(c
, ch
);
2084 if(!set_context(c
, expr1
, Store
, ch
))
2088 if (TYPE(ch
) == testlist
)
2089 expr2
= ast_for_testlist(c
, ch
);
2091 expr2
= ast_for_expr(c
, ch
);
2095 newoperator
= ast_for_augassign(c
, CHILD(n
, 1));
2099 return AugAssign(expr1
, newoperator
, expr2
, LINENO(n
), n
->n_col_offset
,
2108 /* a normal assignment */
2109 REQ(CHILD(n
, 1), EQUAL
);
2110 targets
= asdl_seq_new(NCH(n
) / 2, c
->c_arena
);
2113 for (i
= 0; i
< NCH(n
) - 2; i
+= 2) {
2115 node
*ch
= CHILD(n
, i
);
2116 if (TYPE(ch
) == yield_expr
) {
2117 ast_error(ch
, "assignment to yield expression not possible");
2120 e
= ast_for_testlist(c
, ch
);
2122 /* set context to assign */
2126 if (!set_context(c
, e
, Store
, CHILD(n
, i
)))
2129 asdl_seq_SET(targets
, i
/ 2, e
);
2131 value
= CHILD(n
, NCH(n
) - 1);
2132 if (TYPE(value
) == testlist
)
2133 expression
= ast_for_testlist(c
, value
);
2135 expression
= ast_for_expr(c
, value
);
2138 return Assign(targets
, expression
, LINENO(n
), n
->n_col_offset
,
2144 ast_for_print_stmt(struct compiling
*c
, const node
*n
)
2146 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
2147 | '>>' test [ (',' test)+ [','] ] )
2149 expr_ty dest
= NULL
, expression
;
2150 asdl_seq
*seq
= NULL
;
2152 int i
, j
, values_count
, start
= 1;
2155 if (NCH(n
) >= 2 && TYPE(CHILD(n
, 1)) == RIGHTSHIFT
) {
2156 dest
= ast_for_expr(c
, CHILD(n
, 2));
2161 values_count
= (NCH(n
) + 1 - start
) / 2;
2163 seq
= asdl_seq_new(values_count
, c
->c_arena
);
2166 for (i
= start
, j
= 0; i
< NCH(n
); i
+= 2, ++j
) {
2167 expression
= ast_for_expr(c
, CHILD(n
, i
));
2170 asdl_seq_SET(seq
, j
, expression
);
2173 nl
= (TYPE(CHILD(n
, NCH(n
) - 1)) == COMMA
) ? false : true;
2174 return Print(dest
, seq
, nl
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2178 ast_for_exprlist(struct compiling
*c
, const node
*n
, expr_context_ty context
)
2186 seq
= asdl_seq_new((NCH(n
) + 1) / 2, c
->c_arena
);
2189 for (i
= 0; i
< NCH(n
); i
+= 2) {
2190 e
= ast_for_expr(c
, CHILD(n
, i
));
2193 asdl_seq_SET(seq
, i
/ 2, e
);
2194 if (context
&& !set_context(c
, e
, context
, CHILD(n
, i
)))
2201 ast_for_del_stmt(struct compiling
*c
, const node
*n
)
2203 asdl_seq
*expr_list
;
2205 /* del_stmt: 'del' exprlist */
2208 expr_list
= ast_for_exprlist(c
, CHILD(n
, 1), Del
);
2211 return Delete(expr_list
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2215 ast_for_flow_stmt(struct compiling
*c
, const node
*n
)
2218 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2221 continue_stmt: 'continue'
2222 return_stmt: 'return' [testlist]
2223 yield_stmt: yield_expr
2224 yield_expr: 'yield' testlist
2225 raise_stmt: 'raise' [test [',' test [',' test]]]
2233 return Break(LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2235 return Continue(LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2236 case yield_stmt
: { /* will reduce to yield_expr */
2237 expr_ty exp
= ast_for_expr(c
, CHILD(ch
, 0));
2240 return Expr(exp
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2244 return Return(NULL
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2246 expr_ty expression
= ast_for_testlist(c
, CHILD(ch
, 1));
2249 return Return(expression
, LINENO(n
), n
->n_col_offset
,
2254 return Raise(NULL
, NULL
, NULL
, LINENO(n
), n
->n_col_offset
,
2256 else if (NCH(ch
) == 2) {
2257 expr_ty expression
= ast_for_expr(c
, CHILD(ch
, 1));
2260 return Raise(expression
, NULL
, NULL
, LINENO(n
),
2261 n
->n_col_offset
, c
->c_arena
);
2263 else if (NCH(ch
) == 4) {
2264 expr_ty expr1
, expr2
;
2266 expr1
= ast_for_expr(c
, CHILD(ch
, 1));
2269 expr2
= ast_for_expr(c
, CHILD(ch
, 3));
2273 return Raise(expr1
, expr2
, NULL
, LINENO(n
), n
->n_col_offset
,
2276 else if (NCH(ch
) == 6) {
2277 expr_ty expr1
, expr2
, expr3
;
2279 expr1
= ast_for_expr(c
, CHILD(ch
, 1));
2282 expr2
= ast_for_expr(c
, CHILD(ch
, 3));
2285 expr3
= ast_for_expr(c
, CHILD(ch
, 5));
2289 return Raise(expr1
, expr2
, expr3
, LINENO(n
), n
->n_col_offset
,
2293 PyErr_Format(PyExc_SystemError
,
2294 "unexpected flow_stmt: %d", TYPE(ch
));
2298 PyErr_SetString(PyExc_SystemError
, "unhandled flow statement");
2303 alias_for_import_name(struct compiling
*c
, const node
*n
, int store
)
2306 import_as_name: NAME ['as' NAME]
2307 dotted_as_name: dotted_name ['as' NAME]
2308 dotted_name: NAME ('.' NAME)*
2310 PyObject
*str
, *name
;
2314 case import_as_name
: {
2315 node
*name_node
= CHILD(n
, 0);
2318 node
*str_node
= CHILD(n
, 2);
2319 if (store
&& !forbidden_check(c
, str_node
, STR(str_node
)))
2321 str
= NEW_IDENTIFIER(str_node
);
2326 if (!forbidden_check(c
, name_node
, STR(name_node
)))
2329 name
= NEW_IDENTIFIER(name_node
);
2332 return alias(name
, str
, c
->c_arena
);
2334 case dotted_as_name
:
2340 node
*asname_node
= CHILD(n
, 2);
2341 alias_ty a
= alias_for_import_name(c
, CHILD(n
, 0), 0);
2345 if (!forbidden_check(c
, asname_node
, STR(asname_node
)))
2347 a
->asname
= NEW_IDENTIFIER(asname_node
);
2355 node
*name_node
= CHILD(n
, 0);
2356 if (store
&& !forbidden_check(c
, name_node
, STR(name_node
)))
2358 name
= NEW_IDENTIFIER(name_node
);
2361 return alias(name
, NULL
, c
->c_arena
);
2364 /* Create a string of the form "a.b.c" */
2370 for (i
= 0; i
< NCH(n
); i
+= 2)
2371 /* length of string plus one for the dot */
2372 len
+= strlen(STR(CHILD(n
, i
))) + 1;
2373 len
--; /* the last name doesn't have a dot */
2374 str
= PyString_FromStringAndSize(NULL
, len
);
2377 s
= PyString_AS_STRING(str
);
2380 for (i
= 0; i
< NCH(n
); i
+= 2) {
2381 char *sch
= STR(CHILD(n
, i
));
2382 strcpy(s
, STR(CHILD(n
, i
)));
2388 PyString_InternInPlace(&str
);
2389 PyArena_AddPyObject(c
->c_arena
, str
);
2390 return alias(str
, NULL
, c
->c_arena
);
2394 str
= PyString_InternFromString("*");
2395 PyArena_AddPyObject(c
->c_arena
, str
);
2396 return alias(str
, NULL
, c
->c_arena
);
2398 PyErr_Format(PyExc_SystemError
,
2399 "unexpected import name: %d", TYPE(n
));
2403 PyErr_SetString(PyExc_SystemError
, "unhandled import name condition");
2408 ast_for_import_stmt(struct compiling
*c
, const node
*n
)
2411 import_stmt: import_name | import_from
2412 import_name: 'import' dotted_as_names
2413 import_from: 'from' ('.'* dotted_name | '.') 'import'
2414 ('*' | '(' import_as_names ')' | import_as_names)
2421 REQ(n
, import_stmt
);
2423 col_offset
= n
->n_col_offset
;
2425 if (TYPE(n
) == import_name
) {
2427 REQ(n
, dotted_as_names
);
2428 aliases
= asdl_seq_new((NCH(n
) + 1) / 2, c
->c_arena
);
2431 for (i
= 0; i
< NCH(n
); i
+= 2) {
2432 alias_ty import_alias
= alias_for_import_name(c
, CHILD(n
, i
), 1);
2435 asdl_seq_SET(aliases
, i
/ 2, import_alias
);
2437 return Import(aliases
, lineno
, col_offset
, c
->c_arena
);
2439 else if (TYPE(n
) == import_from
) {
2442 alias_ty mod
= NULL
;
2443 identifier modname
= NULL
;
2445 /* Count the number of dots (for relative imports) and check for the
2446 optional module name */
2447 for (idx
= 1; idx
< NCH(n
); idx
++) {
2448 if (TYPE(CHILD(n
, idx
)) == dotted_name
) {
2449 mod
= alias_for_import_name(c
, CHILD(n
, idx
), 0);
2454 } else if (TYPE(CHILD(n
, idx
)) != DOT
) {
2459 idx
++; /* skip over the 'import' keyword */
2460 switch (TYPE(CHILD(n
, idx
))) {
2462 /* from ... import * */
2467 /* from ... import (x, y, z) */
2468 n
= CHILD(n
, idx
+ 1);
2469 n_children
= NCH(n
);
2471 case import_as_names
:
2472 /* from ... import x, y, z */
2474 n_children
= NCH(n
);
2475 if (n_children
% 2 == 0) {
2476 ast_error(n
, "trailing comma not allowed without"
2477 " surrounding parentheses");
2482 ast_error(n
, "Unexpected node-type in from-import");
2486 aliases
= asdl_seq_new((n_children
+ 1) / 2, c
->c_arena
);
2490 /* handle "from ... import *" special b/c there's no children */
2491 if (TYPE(n
) == STAR
) {
2492 alias_ty import_alias
= alias_for_import_name(c
, n
, 1);
2495 asdl_seq_SET(aliases
, 0, import_alias
);
2498 for (i
= 0; i
< NCH(n
); i
+= 2) {
2499 alias_ty import_alias
= alias_for_import_name(c
, CHILD(n
, i
), 1);
2502 asdl_seq_SET(aliases
, i
/ 2, import_alias
);
2506 modname
= mod
->name
;
2507 return ImportFrom(modname
, aliases
, ndots
, lineno
, col_offset
,
2510 PyErr_Format(PyExc_SystemError
,
2511 "unknown import statement: starts with command '%s'",
2517 ast_for_global_stmt(struct compiling
*c
, const node
*n
)
2519 /* global_stmt: 'global' NAME (',' NAME)* */
2524 REQ(n
, global_stmt
);
2525 s
= asdl_seq_new(NCH(n
) / 2, c
->c_arena
);
2528 for (i
= 1; i
< NCH(n
); i
+= 2) {
2529 name
= NEW_IDENTIFIER(CHILD(n
, i
));
2532 asdl_seq_SET(s
, i
/ 2, name
);
2534 return Global(s
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2538 ast_for_exec_stmt(struct compiling
*c
, const node
*n
)
2540 expr_ty expr1
, globals
= NULL
, locals
= NULL
;
2541 int n_children
= NCH(n
);
2542 if (n_children
!= 2 && n_children
!= 4 && n_children
!= 6) {
2543 PyErr_Format(PyExc_SystemError
,
2544 "poorly formed 'exec' statement: %d parts to statement",
2549 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2551 expr1
= ast_for_expr(c
, CHILD(n
, 1));
2554 if (n_children
>= 4) {
2555 globals
= ast_for_expr(c
, CHILD(n
, 3));
2559 if (n_children
== 6) {
2560 locals
= ast_for_expr(c
, CHILD(n
, 5));
2565 return Exec(expr1
, globals
, locals
, LINENO(n
), n
->n_col_offset
,
2570 ast_for_assert_stmt(struct compiling
*c
, const node
*n
)
2572 /* assert_stmt: 'assert' test [',' test] */
2573 REQ(n
, assert_stmt
);
2575 expr_ty expression
= ast_for_expr(c
, CHILD(n
, 1));
2578 return Assert(expression
, NULL
, LINENO(n
), n
->n_col_offset
,
2581 else if (NCH(n
) == 4) {
2582 expr_ty expr1
, expr2
;
2584 expr1
= ast_for_expr(c
, CHILD(n
, 1));
2587 expr2
= ast_for_expr(c
, CHILD(n
, 3));
2591 return Assert(expr1
, expr2
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2593 PyErr_Format(PyExc_SystemError
,
2594 "improper number of parts to 'assert' statement: %d",
2600 ast_for_suite(struct compiling
*c
, const node
*n
)
2602 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
2605 int i
, total
, num
, end
, pos
= 0;
2610 total
= num_stmts(n
);
2611 seq
= asdl_seq_new(total
, c
->c_arena
);
2614 if (TYPE(CHILD(n
, 0)) == simple_stmt
) {
2616 /* simple_stmt always ends with a NEWLINE,
2617 and may have a trailing SEMI
2620 if (TYPE(CHILD(n
, end
- 1)) == SEMI
)
2622 /* loop by 2 to skip semi-colons */
2623 for (i
= 0; i
< end
; i
+= 2) {
2625 s
= ast_for_stmt(c
, ch
);
2628 asdl_seq_SET(seq
, pos
++, s
);
2632 for (i
= 2; i
< (NCH(n
) - 1); i
++) {
2635 num
= num_stmts(ch
);
2637 /* small_stmt or compound_stmt with only one child */
2638 s
= ast_for_stmt(c
, ch
);
2641 asdl_seq_SET(seq
, pos
++, s
);
2646 REQ(ch
, simple_stmt
);
2647 for (j
= 0; j
< NCH(ch
); j
+= 2) {
2648 /* statement terminates with a semi-colon ';' */
2649 if (NCH(CHILD(ch
, j
)) == 0) {
2650 assert((j
+ 1) == NCH(ch
));
2653 s
= ast_for_stmt(c
, CHILD(ch
, j
));
2656 asdl_seq_SET(seq
, pos
++, s
);
2661 assert(pos
== seq
->size
);
2666 ast_for_if_stmt(struct compiling
*c
, const node
*n
)
2668 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2677 asdl_seq
*suite_seq
;
2679 expression
= ast_for_expr(c
, CHILD(n
, 1));
2682 suite_seq
= ast_for_suite(c
, CHILD(n
, 3));
2686 return If(expression
, suite_seq
, NULL
, LINENO(n
), n
->n_col_offset
,
2690 s
= STR(CHILD(n
, 4));
2691 /* s[2], the third character in the string, will be
2697 asdl_seq
*seq1
, *seq2
;
2699 expression
= ast_for_expr(c
, CHILD(n
, 1));
2702 seq1
= ast_for_suite(c
, CHILD(n
, 3));
2705 seq2
= ast_for_suite(c
, CHILD(n
, 6));
2709 return If(expression
, seq1
, seq2
, LINENO(n
), n
->n_col_offset
,
2712 else if (s
[2] == 'i') {
2713 int i
, n_elif
, has_else
= 0;
2715 asdl_seq
*suite_seq
;
2716 asdl_seq
*orelse
= NULL
;
2717 n_elif
= NCH(n
) - 4;
2718 /* must reference the child n_elif+1 since 'else' token is third,
2719 not fourth, child from the end. */
2720 if (TYPE(CHILD(n
, (n_elif
+ 1))) == NAME
2721 && STR(CHILD(n
, (n_elif
+ 1)))[2] == 's') {
2728 asdl_seq
*suite_seq2
;
2730 orelse
= asdl_seq_new(1, c
->c_arena
);
2733 expression
= ast_for_expr(c
, CHILD(n
, NCH(n
) - 6));
2736 suite_seq
= ast_for_suite(c
, CHILD(n
, NCH(n
) - 4));
2739 suite_seq2
= ast_for_suite(c
, CHILD(n
, NCH(n
) - 1));
2743 asdl_seq_SET(orelse
, 0,
2744 If(expression
, suite_seq
, suite_seq2
,
2745 LINENO(CHILD(n
, NCH(n
) - 6)),
2746 CHILD(n
, NCH(n
) - 6)->n_col_offset
,
2748 /* the just-created orelse handled the last elif */
2752 for (i
= 0; i
< n_elif
; i
++) {
2753 int off
= 5 + (n_elif
- i
- 1) * 4;
2754 asdl_seq
*newobj
= asdl_seq_new(1, c
->c_arena
);
2757 expression
= ast_for_expr(c
, CHILD(n
, off
));
2760 suite_seq
= ast_for_suite(c
, CHILD(n
, off
+ 2));
2764 asdl_seq_SET(newobj
, 0,
2765 If(expression
, suite_seq
, orelse
,
2766 LINENO(CHILD(n
, off
)),
2767 CHILD(n
, off
)->n_col_offset
, c
->c_arena
));
2770 expression
= ast_for_expr(c
, CHILD(n
, 1));
2773 suite_seq
= ast_for_suite(c
, CHILD(n
, 3));
2776 return If(expression
, suite_seq
, orelse
,
2777 LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2780 PyErr_Format(PyExc_SystemError
,
2781 "unexpected token in 'if' statement: %s", s
);
2786 ast_for_while_stmt(struct compiling
*c
, const node
*n
)
2788 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2793 asdl_seq
*suite_seq
;
2795 expression
= ast_for_expr(c
, CHILD(n
, 1));
2798 suite_seq
= ast_for_suite(c
, CHILD(n
, 3));
2801 return While(expression
, suite_seq
, NULL
, LINENO(n
), n
->n_col_offset
,
2804 else if (NCH(n
) == 7) {
2806 asdl_seq
*seq1
, *seq2
;
2808 expression
= ast_for_expr(c
, CHILD(n
, 1));
2811 seq1
= ast_for_suite(c
, CHILD(n
, 3));
2814 seq2
= ast_for_suite(c
, CHILD(n
, 6));
2818 return While(expression
, seq1
, seq2
, LINENO(n
), n
->n_col_offset
,
2822 PyErr_Format(PyExc_SystemError
,
2823 "wrong number of tokens for 'while' statement: %d",
2829 ast_for_for_stmt(struct compiling
*c
, const node
*n
)
2831 asdl_seq
*_target
, *seq
= NULL
, *suite_seq
;
2834 const node
*node_target
;
2835 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2839 seq
= ast_for_suite(c
, CHILD(n
, 8));
2844 node_target
= CHILD(n
, 1);
2845 _target
= ast_for_exprlist(c
, node_target
, Store
);
2848 /* Check the # of children rather than the length of _target, since
2849 for x, in ... has 1 element in _target, but still requires a Tuple. */
2850 if (NCH(node_target
) == 1)
2851 target
= (expr_ty
)asdl_seq_GET(_target
, 0);
2853 target
= Tuple(_target
, Store
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2855 expression
= ast_for_testlist(c
, CHILD(n
, 3));
2858 suite_seq
= ast_for_suite(c
, CHILD(n
, 5));
2862 return For(target
, expression
, suite_seq
, seq
, LINENO(n
), n
->n_col_offset
,
2866 static excepthandler_ty
2867 ast_for_except_clause(struct compiling
*c
, const node
*exc
, node
*body
)
2869 /* except_clause: 'except' [test [(',' | 'as') test]] */
2870 REQ(exc
, except_clause
);
2873 if (NCH(exc
) == 1) {
2874 asdl_seq
*suite_seq
= ast_for_suite(c
, body
);
2878 return ExceptHandler(NULL
, NULL
, suite_seq
, LINENO(exc
),
2879 exc
->n_col_offset
, c
->c_arena
);
2881 else if (NCH(exc
) == 2) {
2883 asdl_seq
*suite_seq
;
2885 expression
= ast_for_expr(c
, CHILD(exc
, 1));
2888 suite_seq
= ast_for_suite(c
, body
);
2892 return ExceptHandler(expression
, NULL
, suite_seq
, LINENO(exc
),
2893 exc
->n_col_offset
, c
->c_arena
);
2895 else if (NCH(exc
) == 4) {
2896 asdl_seq
*suite_seq
;
2898 expr_ty e
= ast_for_expr(c
, CHILD(exc
, 3));
2901 if (!set_context(c
, e
, Store
, CHILD(exc
, 3)))
2903 expression
= ast_for_expr(c
, CHILD(exc
, 1));
2906 suite_seq
= ast_for_suite(c
, body
);
2910 return ExceptHandler(expression
, e
, suite_seq
, LINENO(exc
),
2911 exc
->n_col_offset
, c
->c_arena
);
2914 PyErr_Format(PyExc_SystemError
,
2915 "wrong number of children for 'except' clause: %d",
2921 ast_for_try_stmt(struct compiling
*c
, const node
*n
)
2923 const int nch
= NCH(n
);
2924 int n_except
= (nch
- 3)/3;
2925 asdl_seq
*body
, *orelse
= NULL
, *finally
= NULL
;
2929 body
= ast_for_suite(c
, CHILD(n
, 2));
2933 if (TYPE(CHILD(n
, nch
- 3)) == NAME
) {
2934 if (strcmp(STR(CHILD(n
, nch
- 3)), "finally") == 0) {
2935 if (nch
>= 9 && TYPE(CHILD(n
, nch
- 6)) == NAME
) {
2936 /* we can assume it's an "else",
2937 because nch >= 9 for try-else-finally and
2938 it would otherwise have a type of except_clause */
2939 orelse
= ast_for_suite(c
, CHILD(n
, nch
- 4));
2945 finally
= ast_for_suite(c
, CHILD(n
, nch
- 1));
2946 if (finally
== NULL
)
2951 /* we can assume it's an "else",
2952 otherwise it would have a type of except_clause */
2953 orelse
= ast_for_suite(c
, CHILD(n
, nch
- 1));
2959 else if (TYPE(CHILD(n
, nch
- 3)) != except_clause
) {
2960 ast_error(n
, "malformed 'try' statement");
2967 /* process except statements to create a try ... except */
2968 asdl_seq
*handlers
= asdl_seq_new(n_except
, c
->c_arena
);
2969 if (handlers
== NULL
)
2972 for (i
= 0; i
< n_except
; i
++) {
2973 excepthandler_ty e
= ast_for_except_clause(c
, CHILD(n
, 3 + i
* 3),
2974 CHILD(n
, 5 + i
* 3));
2977 asdl_seq_SET(handlers
, i
, e
);
2980 except_st
= TryExcept(body
, handlers
, orelse
, LINENO(n
),
2981 n
->n_col_offset
, c
->c_arena
);
2985 /* if a 'finally' is present too, we nest the TryExcept within a
2986 TryFinally to emulate try ... except ... finally */
2987 body
= asdl_seq_new(1, c
->c_arena
);
2990 asdl_seq_SET(body
, 0, except_st
);
2993 /* must be a try ... finally (except clauses are in body, if any exist) */
2994 assert(finally
!= NULL
);
2995 return TryFinally(body
, finally
, LINENO(n
), n
->n_col_offset
, c
->c_arena
);
2998 /* with_item: test ['as' expr] */
3000 ast_for_with_item(struct compiling
*c
, const node
*n
, asdl_seq
*content
)
3002 expr_ty context_expr
, optional_vars
= NULL
;
3005 context_expr
= ast_for_expr(c
, CHILD(n
, 0));
3009 optional_vars
= ast_for_expr(c
, CHILD(n
, 2));
3011 if (!optional_vars
) {
3014 if (!set_context(c
, optional_vars
, Store
, n
)) {
3019 return With(context_expr
, optional_vars
, content
, LINENO(n
),
3020 n
->n_col_offset
, c
->c_arena
);
3023 /* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3025 ast_for_with_stmt(struct compiling
*c
, const node
*n
)
3033 /* process the with items inside-out */
3035 /* the suite of the innermost with item is the suite of the with stmt */
3036 inner
= ast_for_suite(c
, CHILD(n
, i
));
3042 ret
= ast_for_with_item(c
, CHILD(n
, i
), inner
);
3045 /* was this the last item? */
3048 /* if not, wrap the result so far in a new sequence */
3049 inner
= asdl_seq_new(1, c
->c_arena
);
3052 asdl_seq_SET(inner
, 0, ret
);
3059 ast_for_classdef(struct compiling
*c
, const node
*n
, asdl_seq
*decorator_seq
)
3061 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3062 PyObject
*classname
;
3063 asdl_seq
*bases
, *s
;
3067 if (!forbidden_check(c
, n
, STR(CHILD(n
, 1))))
3071 s
= ast_for_suite(c
, CHILD(n
, 3));
3074 classname
= NEW_IDENTIFIER(CHILD(n
, 1));
3077 return ClassDef(classname
, NULL
, s
, decorator_seq
, LINENO(n
),
3078 n
->n_col_offset
, c
->c_arena
);
3080 /* check for empty base list */
3081 if (TYPE(CHILD(n
,3)) == RPAR
) {
3082 s
= ast_for_suite(c
, CHILD(n
,5));
3085 classname
= NEW_IDENTIFIER(CHILD(n
, 1));
3088 return ClassDef(classname
, NULL
, s
, decorator_seq
, LINENO(n
),
3089 n
->n_col_offset
, c
->c_arena
);
3092 /* else handle the base class list */
3093 bases
= ast_for_class_bases(c
, CHILD(n
, 3));
3097 s
= ast_for_suite(c
, CHILD(n
, 6));
3100 classname
= NEW_IDENTIFIER(CHILD(n
, 1));
3103 return ClassDef(classname
, bases
, s
, decorator_seq
,
3104 LINENO(n
), n
->n_col_offset
, c
->c_arena
);
3108 ast_for_stmt(struct compiling
*c
, const node
*n
)
3110 if (TYPE(n
) == stmt
) {
3111 assert(NCH(n
) == 1);
3114 if (TYPE(n
) == simple_stmt
) {
3115 assert(num_stmts(n
) == 1);
3118 if (TYPE(n
) == small_stmt
) {
3120 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
3121 | flow_stmt | import_stmt | global_stmt | exec_stmt
3126 return ast_for_expr_stmt(c
, n
);
3128 return ast_for_print_stmt(c
, n
);
3130 return ast_for_del_stmt(c
, n
);
3132 return Pass(LINENO(n
), n
->n_col_offset
, c
->c_arena
);
3134 return ast_for_flow_stmt(c
, n
);
3136 return ast_for_import_stmt(c
, n
);
3138 return ast_for_global_stmt(c
, n
);
3140 return ast_for_exec_stmt(c
, n
);
3142 return ast_for_assert_stmt(c
, n
);
3144 PyErr_Format(PyExc_SystemError
,
3145 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3151 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
3152 | funcdef | classdef | decorated
3154 node
*ch
= CHILD(n
, 0);
3155 REQ(n
, compound_stmt
);
3158 return ast_for_if_stmt(c
, ch
);
3160 return ast_for_while_stmt(c
, ch
);
3162 return ast_for_for_stmt(c
, ch
);
3164 return ast_for_try_stmt(c
, ch
);
3166 return ast_for_with_stmt(c
, ch
);
3168 return ast_for_funcdef(c
, ch
, NULL
);
3170 return ast_for_classdef(c
, ch
, NULL
);
3172 return ast_for_decorated(c
, ch
);
3174 PyErr_Format(PyExc_SystemError
,
3175 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3183 parsenumber(struct compiling
*c
, const char *s
)
3188 #ifndef WITHOUT_COMPLEX
3195 end
= s
+ strlen(s
) - 1;
3196 #ifndef WITHOUT_COMPLEX
3197 imflag
= *end
== 'j' || *end
== 'J';
3199 if (*end
== 'l' || *end
== 'L')
3200 return PyLong_FromString((char *)s
, (char **)0, 0);
3201 x
= PyOS_strtol((char *)s
, (char **)&end
, 0);
3204 return PyLong_FromString((char *)s
, (char **)0, 0);
3205 return PyInt_FromLong(x
);
3207 /* XXX Huge floats may silently fail */
3208 #ifndef WITHOUT_COMPLEX
3211 PyFPE_START_PROTECT("atof", return 0)
3212 complex.imag
= PyOS_ascii_atof(s
);
3213 PyFPE_END_PROTECT(complex)
3214 return PyComplex_FromCComplex(complex);
3219 PyFPE_START_PROTECT("atof", return 0)
3220 dx
= PyOS_ascii_atof(s
);
3221 PyFPE_END_PROTECT(dx
)
3222 return PyFloat_FromDouble(dx
);
3227 decode_utf8(struct compiling
*c
, const char **sPtr
, const char *end
, char* encoding
)
3229 #ifndef Py_USING_UNICODE
3230 Py_FatalError("decode_utf8 should not be called in this build.");
3235 t
= s
= (char *)*sPtr
;
3236 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3237 while (s
< end
&& (*s
& 0x80)) s
++;
3239 u
= PyUnicode_DecodeUTF8(t
, s
- t
, NULL
);
3242 v
= PyUnicode_AsEncodedString(u
, encoding
, NULL
);
3248 #ifdef Py_USING_UNICODE
3250 decode_unicode(struct compiling
*c
, const char *s
, size_t len
, int rawmode
, const char *encoding
)
3256 if (encoding
== NULL
) {
3259 } else if (strcmp(encoding
, "iso-8859-1") == 0) {
3263 /* check for integer overflow */
3264 if (len
> PY_SIZE_MAX
/ 4)
3266 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3267 u
= PyString_FromStringAndSize((char *)NULL
, len
* 4);
3270 p
= buf
= PyString_AsString(u
);
3280 if (*s
& 0x80) { /* XXX inefficient */
3284 w
= decode_utf8(c
, &s
, end
, "utf-16-be");
3289 r
= PyString_AsString(w
);
3290 rn
= PyString_Size(w
);
3291 assert(rn
% 2 == 0);
3292 for (i
= 0; i
< rn
; i
+= 2) {
3293 sprintf(p
, "\\u%02x%02x",
3307 v
= PyUnicode_DecodeRawUnicodeEscape(s
, len
, NULL
);
3309 v
= PyUnicode_DecodeUnicodeEscape(s
, len
, NULL
);
3315 /* s is a Python string literal, including the bracketing quote characters,
3316 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3317 * parsestr parses it, and returns the decoded Python string object.
3320 parsestr(struct compiling
*c
, const char *s
)
3323 int quote
= Py_CHARMASK(*s
);
3326 int unicode
= c
->c_future_unicode
;
3328 if (isalpha(quote
) || quote
== '_') {
3329 if (quote
== 'u' || quote
== 'U') {
3333 if (quote
== 'b' || quote
== 'B') {
3337 if (quote
== 'r' || quote
== 'R') {
3342 if (quote
!= '\'' && quote
!= '\"') {
3343 PyErr_BadInternalCall();
3348 if (len
> INT_MAX
) {
3349 PyErr_SetString(PyExc_OverflowError
,
3350 "string to parse is too long");
3353 if (s
[--len
] != quote
) {
3354 PyErr_BadInternalCall();
3357 if (len
>= 4 && s
[0] == quote
&& s
[1] == quote
) {
3360 if (s
[--len
] != quote
|| s
[--len
] != quote
) {
3361 PyErr_BadInternalCall();
3365 #ifdef Py_USING_UNICODE
3366 if (unicode
|| Py_UnicodeFlag
) {
3367 return decode_unicode(c
, s
, len
, rawmode
, c
->c_encoding
);
3370 need_encoding
= (c
->c_encoding
!= NULL
&&
3371 strcmp(c
->c_encoding
, "utf-8") != 0 &&
3372 strcmp(c
->c_encoding
, "iso-8859-1") != 0);
3373 if (rawmode
|| strchr(s
, '\\') == NULL
) {
3374 if (need_encoding
) {
3375 #ifndef Py_USING_UNICODE
3376 /* This should not happen - we never see any other
3379 "cannot deal with encodings in this build.");
3381 PyObject
*v
, *u
= PyUnicode_DecodeUTF8(s
, len
, NULL
);
3384 v
= PyUnicode_AsEncodedString(u
, c
->c_encoding
, NULL
);
3389 return PyString_FromStringAndSize(s
, len
);
3393 return PyString_DecodeEscape(s
, len
, NULL
, unicode
,
3394 need_encoding
? c
->c_encoding
: NULL
);
3397 /* Build a Python string object out of a STRING atom. This takes care of
3398 * compile-time literal catenation, calling parsestr() on each piece, and
3399 * pasting the intermediate results together.
3402 parsestrplus(struct compiling
*c
, const node
*n
)
3406 REQ(CHILD(n
, 0), STRING
);
3407 if ((v
= parsestr(c
, STR(CHILD(n
, 0)))) != NULL
) {
3408 /* String literal concatenation */
3409 for (i
= 1; i
< NCH(n
); i
++) {
3411 s
= parsestr(c
, STR(CHILD(n
, i
)));
3414 if (PyString_Check(v
) && PyString_Check(s
)) {
3415 PyString_ConcatAndDel(&v
, s
);
3419 #ifdef Py_USING_UNICODE
3421 PyObject
*temp
= PyUnicode_Concat(v
, s
);