Module Name: src Committed By: rillig Date: Fri Oct 8 21:48:33 UTC 2021
Modified Files: src/tests/usr.bin/indent: token-keyword_else.0 token-keyword_else.0.stdout src/usr.bin/indent: parse.c Log Message: indent: clean up 'parse', add test for dangling else No functional change. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/indent/token-keyword_else.0 \ src/tests/usr.bin/indent/token-keyword_else.0.stdout cvs rdiff -u -r1.33 -r1.34 src/usr.bin/indent/parse.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/usr.bin/indent/token-keyword_else.0 diff -u src/tests/usr.bin/indent/token-keyword_else.0:1.1 src/tests/usr.bin/indent/token-keyword_else.0:1.2 --- src/tests/usr.bin/indent/token-keyword_else.0:1.1 Fri Mar 12 00:13:06 2021 +++ src/tests/usr.bin/indent/token-keyword_else.0 Fri Oct 8 21:48:33 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: token-keyword_else.0,v 1.1 2021/03/12 00:13:06 rillig Exp $ */ +/* $NetBSD: token-keyword_else.0,v 1.2 2021/10/08 21:48:33 rillig Exp $ */ /* $FreeBSD$ */ /* @@ -9,4 +9,21 @@ * innermost incomplete 'if' statement. */ -/* TODO: Add some code to be formatted. */ +/* + * In 'parse', an if_expr_stmt is reduced to a simple statement, unless the + * next token is 'else'. The comment does not influence this since it never + * reaches 'parse'. + */ +void +example(bool cond) +{ + if (cond) + if (cond) + if (cond) + stmt(); + else + stmt(); + /* comment */ + else + stmt(); +} Index: src/tests/usr.bin/indent/token-keyword_else.0.stdout diff -u src/tests/usr.bin/indent/token-keyword_else.0.stdout:1.1 src/tests/usr.bin/indent/token-keyword_else.0.stdout:1.2 --- src/tests/usr.bin/indent/token-keyword_else.0.stdout:1.1 Fri Mar 12 00:13:06 2021 +++ src/tests/usr.bin/indent/token-keyword_else.0.stdout Fri Oct 8 21:48:33 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: token-keyword_else.0.stdout,v 1.1 2021/03/12 00:13:06 rillig Exp $ */ +/* $NetBSD: token-keyword_else.0.stdout,v 1.2 2021/10/08 21:48:33 rillig Exp $ */ /* $FreeBSD$ */ /* @@ -9,4 +9,21 @@ * innermost incomplete 'if' statement. */ -/* TODO: Add some code to be formatted. */ +/* + * In 'parse', an if_expr_stmt is reduced to a simple statement, unless the + * next token is 'else'. The comment does not influence this since it never + * reaches 'parse'. + */ +void +example(bool cond) +{ + if (cond) + if (cond) + if (cond) + stmt(); + else + stmt(); + /* comment */ + else + stmt(); +} Index: src/usr.bin/indent/parse.c diff -u src/usr.bin/indent/parse.c:1.33 src/usr.bin/indent/parse.c:1.34 --- src/usr.bin/indent/parse.c:1.33 Thu Oct 7 22:56:49 2021 +++ src/usr.bin/indent/parse.c Fri Oct 8 21:48:33 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.33 2021/10/07 22:56:49 rillig Exp $ */ +/* $NetBSD: parse.c,v 1.34 2021/10/08 21:48:33 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -62,16 +62,14 @@ static void reduce(void); void parse(token_type ttype) { + debug_println("parse token: '%s' \"%s\"", + token_type_name(ttype), token.s); -#ifdef debug - printf("parse token: '%s' \"%s\"\n", token_type_name(ttype), token.s); -#endif - - while (ps.p_stack[ps.tos] == if_expr_stmt && ttype != keyword_else) { - /* true if we have an if without an else */ - ps.p_stack[ps.tos] = stmt; /* apply the if(..) stmt ::= stmt - * reduction */ - reduce(); /* see if this allows any reduction */ + if (ttype != keyword_else) { + while (ps.p_stack[ps.tos] == if_expr_stmt) { + ps.p_stack[ps.tos] = stmt; + reduce(); + } } switch (ttype) {