Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/indent indent: track the kind of '{' on the parser s...
details: https://anonhg.NetBSD.org/src/rev/c945e3e9093d
branches: trunk
changeset: 376205:c945e3e9093d
user: rillig <rillig%NetBSD.org@localhost>
date: Sun Jun 04 17:54:11 2023 +0000
description:
indent: track the kind of '{' on the parser stack
diffstat:
usr.bin/indent/debug.c | 20 ++++++++------------
usr.bin/indent/indent.c | 44 ++++++++++++++------------------------------
usr.bin/indent/indent.h | 16 +++++++---------
usr.bin/indent/io.c | 6 +++---
usr.bin/indent/parse.c | 24 ++++++++++++++++++------
5 files changed, 50 insertions(+), 60 deletions(-)
diffs (286 lines):
diff -r a9770bc997c2 -r c945e3e9093d usr.bin/indent/debug.c
--- a/usr.bin/indent/debug.c Sun Jun 04 17:48:05 2023 +0000
+++ b/usr.bin/indent/debug.c Sun Jun 04 17:54:11 2023 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: debug.c,v 1.32 2023/06/04 17:02:06 rillig Exp $ */
+/* $NetBSD: debug.c,v 1.33 2023/06/04 17:54:11 rillig Exp $ */
/*-
* Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: debug.c,v 1.32 2023/06/04 17:02:06 rillig Exp $");
+__RCSID("$NetBSD: debug.c,v 1.33 2023/06/04 17:54:11 rillig Exp $");
#include <stdarg.h>
@@ -86,8 +86,11 @@ const char *const lsym_name[] = {
};
const char *const psym_name[] = {
- "0",
- "lbrace",
+ "-",
+ "lbrace_block",
+ "lbrace_struct",
+ "lbrace_union",
+ "lbrace_enum",
"rbrace",
"decl",
"stmt",
@@ -109,13 +112,6 @@ static const char *const declaration_nam
"end",
};
-static const char *const in_enum_name[] = {
- "no",
- "enum",
- "type",
- "brace",
-};
-
const char *const paren_level_cast_name[] = {
"(unknown cast)",
"(maybe cast)",
@@ -325,7 +321,7 @@ debug_parser_state(void)
debug_ps_enum(declaration, declaration_name);
debug_ps_bool(blank_line_after_decl);
debug_ps_bool(in_func_def_params);
- debug_ps_enum(in_enum, in_enum_name);
+ debug_ps_enum(lbrace_kind, psym_name);
debug_ps_enum(decl_ptr, decl_ptr_name);
debug_ps_bool(decl_indent_done);
debug_ps_int(decl_ind);
diff -r a9770bc997c2 -r c945e3e9093d usr.bin/indent/indent.c
--- a/usr.bin/indent/indent.c Sun Jun 04 17:48:05 2023 +0000
+++ b/usr.bin/indent/indent.c Sun Jun 04 17:54:11 2023 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: indent.c,v 1.325 2023/06/04 14:38:15 rillig Exp $ */
+/* $NetBSD: indent.c,v 1.326 2023/06/04 17:54:11 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: indent.c,v 1.325 2023/06/04 14:38:15 rillig Exp $");
+__RCSID("$NetBSD: indent.c,v 1.326 2023/06/04 17:54:11 rillig Exp $");
#include <sys/param.h>
#include <err.h>
@@ -181,6 +181,7 @@ init_globals(void)
ps.s_sym[0] = psym_stmt_list;
ps.prev_lsym = lsym_semicolon;
ps.next_col_1 = true;
+ ps.lbrace_kind = psym_lbrace_block;
const char *suffix = getenv("SIMPLE_BACKUP_SUFFIX");
if (suffix != NULL)
@@ -371,33 +372,16 @@ update_ps_decl_ptr(lexer_symbol lsym)
}
static void
-update_ps_in_enum(lexer_symbol lsym)
+update_ps_prev_tag(lexer_symbol lsym)
{
- switch (ps.in_enum) {
- case in_enum_no:
- if (lsym == lsym_tag && token.st[0] == 'e')
- ps.in_enum = in_enum_enum;
- break;
- case in_enum_enum:
- if (lsym == lsym_type_outside_parentheses
- || lsym == lsym_type_in_parentheses)
- ps.in_enum = in_enum_type;
- else if (lsym == lsym_lbrace)
- ps.in_enum = in_enum_brace;
- else
- ps.in_enum = in_enum_no;
- break;
- case in_enum_type:
- if (lsym == lsym_lbrace)
- ps.in_enum = in_enum_brace;
- else
- ps.in_enum = in_enum_no;
- break;
- case in_enum_brace:
- if (lsym == lsym_rbrace)
- ps.in_enum = in_enum_no;
- break;
- }
+ if (lsym == lsym_tag) {
+ ps.lbrace_kind = token.mem[0] == 's' ? psym_lbrace_struct :
+ token.mem[0] == 'u' ? psym_lbrace_union :
+ psym_lbrace_enum;
+ } else if (lsym != lsym_type_outside_parentheses
+ && lsym != lsym_word
+ && lsym != lsym_lbrace)
+ ps.lbrace_kind = psym_lbrace_block;
}
static int
@@ -828,7 +812,7 @@ process_lbrace(void)
}
ps.decl_ind = 0;
- parse(psym_lbrace);
+ parse(ps.lbrace_kind);
if (ps.want_blank)
buf_add_char(&code, ' ');
ps.want_blank = false;
@@ -1278,7 +1262,7 @@ indent(void)
if (com.len > 0)
move_com_to_code(lsym);
update_ps_decl_ptr(lsym);
- update_ps_in_enum(lsym);
+ update_ps_prev_tag(lsym);
}
process_lsym(lsym);
diff -r a9770bc997c2 -r c945e3e9093d usr.bin/indent/indent.h
--- a/usr.bin/indent/indent.h Sun Jun 04 17:48:05 2023 +0000
+++ b/usr.bin/indent/indent.h Sun Jun 04 17:54:11 2023 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: indent.h,v 1.169 2023/06/04 17:02:06 rillig Exp $ */
+/* $NetBSD: indent.h,v 1.170 2023/06/04 17:54:11 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -118,7 +118,10 @@ typedef enum lexer_symbol {
*/
typedef enum parser_symbol {
psym_0, /* a placeholder; not stored on the stack */
- psym_lbrace,
+ psym_lbrace_block, /* '{' for a block of code */
+ psym_lbrace_struct, /* '{' in 'struct ... { ... }' */
+ psym_lbrace_union, /* '{' in 'union ... { ... }' */
+ psym_lbrace_enum, /* '{' in 'enum ... { ... }' */
psym_rbrace, /* not stored on the stack */
psym_decl,
psym_stmt,
@@ -326,6 +329,8 @@ extern struct parser_state {
* after the parenthesized expression
* from a 'for', 'if', 'switch' or
* 'while'; or psym_0 */
+ parser_symbol lbrace_kind; /* the kind of brace to be pushed to
+ * the parser symbol stack next */
/* Indentation of statements and declarations */
@@ -350,13 +355,6 @@ extern struct parser_state {
eei_last
} extra_expr_indent;
- enum {
- in_enum_no, /* outside any 'enum { ... }' */
- in_enum_enum, /* after keyword 'enum' */
- in_enum_type, /* after 'enum' or 'enum tag' */
- in_enum_brace /* between '{' and '}' */
- } in_enum; /* enum { . } */
-
int tos; /* pointer to top of stack */
parser_symbol s_sym[STACKSIZE];
int s_ind_level[STACKSIZE];
diff -r a9770bc997c2 -r c945e3e9093d usr.bin/indent/io.c
--- a/usr.bin/indent/io.c Sun Jun 04 17:48:05 2023 +0000
+++ b/usr.bin/indent/io.c Sun Jun 04 17:54:11 2023 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: io.c,v 1.190 2023/06/04 14:38:15 rillig Exp $ */
+/* $NetBSD: io.c,v 1.191 2023/06/04 17:54:11 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: io.c,v 1.190 2023/06/04 14:38:15 rillig Exp $");
+__RCSID("$NetBSD: io.c,v 1.191 2023/06/04 17:54:11 rillig Exp $");
#include <stdio.h>
@@ -347,7 +347,7 @@ compute_code_indent(void)
int base_ind = ps.ind_level * opt.indent_size;
if (ps.line_start_nparen == 0) {
- if (ps.in_enum == in_enum_brace)
+ if (ps.tos >= 1 && ps.s_sym[ps.tos - 1] == psym_lbrace_enum)
return base_ind;
if (ps.in_stmt_cont)
return base_ind + opt.continuation_indent;
diff -r a9770bc997c2 -r c945e3e9093d usr.bin/indent/parse.c
--- a/usr.bin/indent/parse.c Sun Jun 04 17:48:05 2023 +0000
+++ b/usr.bin/indent/parse.c Sun Jun 04 17:54:11 2023 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: parse.c,v 1.64 2023/06/03 21:24:26 rillig Exp $ */
+/* $NetBSD: parse.c,v 1.65 2023/06/04 17:54:11 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: parse.c,v 1.64 2023/06/03 21:24:26 rillig Exp $");
+__RCSID("$NetBSD: parse.c,v 1.65 2023/06/04 17:54:11 rillig Exp $");
#include <err.h>
@@ -70,6 +70,15 @@ ps_push_follow(parser_symbol psym)
ps.s_ind_level[ps.tos] = ps.ind_level_follow;
}
+static bool
+is_lbrace(parser_symbol psym)
+{
+ return psym == psym_lbrace_block
+ || psym == psym_lbrace_struct
+ || psym == psym_lbrace_union
+ || psym == psym_lbrace_enum;
+}
+
/*
* Shift the token onto the parser stack, or reduce it by combining it with
* previous tokens.
@@ -110,7 +119,10 @@ parse(parser_symbol psym)
ps_push(psym);
break;
- case psym_lbrace:
+ case psym_lbrace_block:
+ case psym_lbrace_struct:
+ case psym_lbrace_union:
+ case psym_lbrace_enum:
ps.break_after_comma = false;
if (ps.s_sym[ps.tos] == psym_stmt
|| ps.s_sym[ps.tos] == psym_decl
@@ -132,7 +144,7 @@ parse(parser_symbol psym)
}
}
- ps_push(psym_lbrace);
+ ps_push(psym);
ps_push_follow(psym_stmt);
break;
@@ -160,7 +172,7 @@ parse(parser_symbol psym)
case psym_rbrace:
/* stack should have <lbrace> <stmt> or <lbrace> <stmt_list> */
- if (!(ps.tos > 0 && ps.s_sym[ps.tos - 1] == psym_lbrace)) {
+ if (!(ps.tos > 0 && is_lbrace(ps.s_sym[ps.tos - 1]))) {
diag(1, "Statement nesting error");
break;
}
@@ -217,7 +229,7 @@ reduce_stmt(void)
int i = ps.tos - 1;
while (ps.s_sym[i] != psym_stmt &&
ps.s_sym[i] != psym_stmt_list &&
- ps.s_sym[i] != psym_lbrace)
+ ps.s_sym[i] != psym_lbrace_block)
--i;
ps.ind_level_follow = ps.s_ind_level[i];
/* For the time being, assume that there is no 'else' on this
Home |
Main Index |
Thread Index |
Old Index