@@ -2057,6 +2057,7 @@ validate_for(node *tree)
20572057
20582058/* try_stmt:
20592059 * 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2060+ ['finally' ':' suite]
20602061 * | 'try' ':' suite 'finally' ':' suite
20612062 *
20622063 */
@@ -2082,35 +2083,34 @@ validate_try(node *tree)
20822083 PyErr_Format (parser_error ,
20832084 "Illegal number of children for try/%s node." , name );
20842085 }
2085- /* Skip past except_clause sections: */
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 )));
2092+ return (res );
2093+ }
2094+ /* try/except statement: skip past except_clause sections */
20862095 while (res && (TYPE (CHILD (tree , pos )) == except_clause )) {
20872096 res = (validate_except_clause (CHILD (tree , pos ))
20882097 && validate_colon (CHILD (tree , pos + 1 ))
20892098 && validate_suite (CHILD (tree , pos + 2 )));
20902099 pos += 3 ;
20912100 }
2092- if (res && (pos < nch )) {
2093- res = validate_ntype (CHILD (tree , pos ), NAME );
2094- if (res && (strcmp (STR (CHILD (tree , pos )), "finally" ) == 0 ))
2095- res = (validate_numnodes (tree , 6 , "try/finally" )
2096- && validate_colon (CHILD (tree , 4 ))
2097- && validate_suite (CHILD (tree , 5 )));
2098- else if (res ) {
2099- if (nch == (pos + 3 )) {
2100- res = ((strcmp (STR (CHILD (tree , pos )), "except" ) == 0 )
2101- || (strcmp (STR (CHILD (tree , pos )), "else" ) == 0 ));
2102- if (!res )
2103- err_string ("illegal trailing triple in try statement" );
2104- }
2105- else if (nch == (pos + 6 )) {
2106- res = (validate_name (CHILD (tree , pos ), "except" )
2107- && validate_colon (CHILD (tree , pos + 1 ))
2108- && validate_suite (CHILD (tree , pos + 2 ))
2109- && validate_name (CHILD (tree , pos + 3 ), "else" ));
2110- }
2111- else
2112- res = validate_numnodes (tree , pos + 3 , "try/except" );
2113- }
2101+ /* skip else clause */
2102+ if (res && (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 )));
2106+ pos += 3 ;
2107+ }
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 )));
21142114 }
21152115 return (res );
21162116}
0 commit comments