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