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

Reply via email to