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) {