@@ -2865,34 +2865,92 @@ validate_exprlist(node *tree)
28652865 validate_expr_or_star_expr , "exprlist" ));
28662866}
28672867
2868-
2868+ /*
2869+ * dictorsetmaker:
2870+ *
2871+ * (test ':' test (comp_for | (',' test ':' test)* [','])) |
2872+ * (test (comp_for | (',' test)* [',']))
2873+ */
28692874static int
28702875validate_dictorsetmaker (node * tree )
28712876{
28722877 int nch = NCH (tree );
2873- int res = (validate_ntype (tree , dictorsetmaker )
2874- && (nch >= 3 )
2875- && validate_test (CHILD (tree , 0 ))
2876- && validate_colon (CHILD (tree , 1 ))
2877- && validate_test (CHILD (tree , 2 )));
2878+ int res ;
2879+ int i = 0 ;
2880+
2881+ res = validate_ntype (tree , dictorsetmaker );
2882+ if (!res )
2883+ return 0 ;
28782884
2879- if (res && ((nch % 4 ) == 0 ))
2880- res = validate_comma (CHILD (tree , -- nch ));
2881- else if (res )
2882- res = ((nch % 4 ) == 3 );
2883-
2884- if (res && (nch > 3 )) {
2885- int pos = 3 ;
2886- /* ( ',' test ':' test )* */
2887- while (res && (pos < nch )) {
2888- res = (validate_comma (CHILD (tree , pos ))
2889- && validate_test (CHILD (tree , pos + 1 ))
2890- && validate_colon (CHILD (tree , pos + 2 ))
2891- && validate_test (CHILD (tree , pos + 3 )));
2892- pos += 4 ;
2885+ if (nch - i < 1 ) {
2886+ (void ) validate_numnodes (tree , 1 , "dictorsetmaker" );
2887+ return 0 ;
2888+ }
2889+
2890+ res = validate_test (CHILD (tree , i ++ ));
2891+ if (!res )
2892+ return 0 ;
2893+
2894+ if (nch - i >= 2 && TYPE (CHILD (tree , i )) == COLON ) {
2895+ /* Dictionary display or dictionary comprehension. */
2896+ res = (validate_colon (CHILD (tree , i ++ ))
2897+ && validate_test (CHILD (tree , i ++ )));
2898+ if (!res )
2899+ return 0 ;
2900+
2901+ if (nch - i >= 1 && TYPE (CHILD (tree , i )) == comp_for ) {
2902+ /* Dictionary comprehension. */
2903+ res = validate_comp_for (CHILD (tree , i ++ ));
2904+ if (!res )
2905+ return 0 ;
2906+ }
2907+ else {
2908+ /* Dictionary display. */
2909+ while (nch - i >= 4 ) {
2910+ res = (validate_comma (CHILD (tree , i ++ ))
2911+ && validate_test (CHILD (tree , i ++ ))
2912+ && validate_colon (CHILD (tree , i ++ ))
2913+ && validate_test (CHILD (tree , i ++ )));
2914+ if (!res )
2915+ return 0 ;
2916+ }
2917+ if (nch - i == 1 ) {
2918+ res = validate_comma (CHILD (tree , i ++ ));
2919+ if (!res )
2920+ return 0 ;
2921+ }
28932922 }
28942923 }
2895- return (res );
2924+ else {
2925+ /* Set display or set comprehension. */
2926+ if (nch - i >= 1 && TYPE (CHILD (tree , i )) == comp_for ) {
2927+ /* Set comprehension. */
2928+ res = validate_comp_for (CHILD (tree , i ++ ));
2929+ if (!res )
2930+ return 0 ;
2931+ }
2932+ else {
2933+ /* Set display. */
2934+ while (nch - i >= 2 ) {
2935+ res = (validate_comma (CHILD (tree , i ++ ))
2936+ && validate_test (CHILD (tree , i ++ )));
2937+ if (!res )
2938+ return 0 ;
2939+ }
2940+ if (nch - i == 1 ) {
2941+ res = validate_comma (CHILD (tree , i ++ ));
2942+ if (!res )
2943+ return 0 ;
2944+ }
2945+ }
2946+ }
2947+
2948+ if (nch - i > 0 ) {
2949+ err_string ("Illegal trailing nodes for dictorsetmaker." );
2950+ return 0 ;
2951+ }
2952+
2953+ return 1 ;
28962954}
28972955
28982956
0 commit comments