Module Name: src Committed By: rillig Date: Sun May 12 08:48:36 UTC 2024
Modified Files: src/usr.bin/xlint/lint1: cgram.y externs1.h lex.c scan.l Log Message: lint: move code for parsing balanced token sequences to lex.c To access yytext from lex.c, the lexer needs to be in %pointer mode, which was specified in IEEE Std 1003.1, 2004 Edition and thus should be old enough to be available on platforms other than NetBSD, for use in tools/lint1 where lint1 is built before yacc and lex. To generate a diff of this commit: cvs rdiff -u -r1.501 -r1.502 src/usr.bin/xlint/lint1/cgram.y cvs rdiff -u -r1.226 -r1.227 src/usr.bin/xlint/lint1/externs1.h cvs rdiff -u -r1.225 -r1.226 src/usr.bin/xlint/lint1/lex.c cvs rdiff -u -r1.141 -r1.142 src/usr.bin/xlint/lint1/scan.l Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/xlint/lint1/cgram.y diff -u src/usr.bin/xlint/lint1/cgram.y:1.501 src/usr.bin/xlint/lint1/cgram.y:1.502 --- src/usr.bin/xlint/lint1/cgram.y:1.501 Sat May 11 16:58:59 2024 +++ src/usr.bin/xlint/lint1/cgram.y Sun May 12 08:48:36 2024 @@ -1,5 +1,5 @@ %{ -/* $NetBSD: cgram.y,v 1.501 2024/05/11 16:58:59 rillig Exp $ */ +/* $NetBSD: cgram.y,v 1.502 2024/05/12 08:48:36 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: cgram.y,v 1.501 2024/05/11 16:58:59 rillig Exp $"); +__RCSID("$NetBSD: cgram.y,v 1.502 2024/05/12 08:48:36 rillig Exp $"); #endif #include <limits.h> @@ -2562,78 +2562,11 @@ read_until_rparen(void) yyclearin; } -static void -fill_token(token *tok) -{ - switch (yychar) { - case T_NAME: - case T_TYPENAME: - tok->kind = TK_IDENTIFIER; - tok->u.identifier = xstrdup(yylval.y_name->sb_name); - break; - case T_CON: - tok->kind = TK_CONSTANT; - tok->u.constant = *yylval.y_val; - break; - case T_NAMED_CONSTANT: - tok->kind = TK_IDENTIFIER; - tok->u.identifier = xstrdup(yytext); - break; - case T_STRING:; - tok->kind = TK_STRING_LITERALS; - tok->u.string_literals.len = yylval.y_string->len; - tok->u.string_literals.cap = yylval.y_string->cap; - tok->u.string_literals.data = xstrdup(yylval.y_string->data); - break; - default: - tok->kind = TK_PUNCTUATOR; - tok->u.punctuator = xstrdup(yytext); - } -} - -static void -seq_reserve(balanced_token_sequence *seq) -{ - if (seq->len >= seq->cap) { - seq->cap = 16 + 2 * seq->cap; - const balanced_token *old_tokens = seq->tokens; - balanced_token *new_tokens = block_zero_alloc( - seq->cap * sizeof(*seq->tokens), "balanced_tokens"); - memcpy(new_tokens, old_tokens, seq->len * sizeof(*seq->tokens)); - seq->tokens = new_tokens; - } -} - -static balanced_token_sequence -read_balanced(int opening) -{ - debug_enter(); - int closing = opening == T_LPAREN ? T_RPAREN - : opening == T_LBRACK ? T_RBRACK : T_RBRACE; - balanced_token_sequence seq = { NULL, 0, 0 }; - debug_step("opening %d, closing %d", opening, closing); - - while (yychar = yylex(), yychar > 0 && yychar != closing) { - debug_step("reading token %d", yychar); - seq_reserve(&seq); - if (yychar == T_LPAREN - || yychar == T_LBRACK - || yychar == T_LBRACE) { - seq.tokens[seq.len].kind = yychar == T_LPAREN ? '(' - : yychar == T_LBRACK ? '[' : '{'; - seq.tokens[seq.len++].u.tokens = read_balanced(yychar); - } else - fill_token(&seq.tokens[seq.len++].u.token); - } - debug_leave(); - return seq; -} - static balanced_token_sequence read_balanced_token_sequence(void) { lint_assert(yychar < 0); - balanced_token_sequence seq = read_balanced(T_LPAREN); + balanced_token_sequence seq = lex_balanced(); yyclearin; return seq; } Index: src/usr.bin/xlint/lint1/externs1.h diff -u src/usr.bin/xlint/lint1/externs1.h:1.226 src/usr.bin/xlint/lint1/externs1.h:1.227 --- src/usr.bin/xlint/lint1/externs1.h:1.226 Sat May 11 16:12:28 2024 +++ src/usr.bin/xlint/lint1/externs1.h Sun May 12 08:48:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: externs1.h,v 1.226 2024/05/11 16:12:28 rillig Exp $ */ +/* $NetBSD: externs1.h,v 1.227 2024/05/12 08:48:36 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -72,6 +72,7 @@ extern int yydebug; int yyerror(const char *); int yyparse(void); +extern char *yytext; /* * lex.c @@ -402,6 +403,7 @@ void lex_slash_slash_comment(void); void lex_unknown_character(int); int lex_input(void); bool quoted_next(const buffer *, quoted_iterator *); +balanced_token_sequence lex_balanced(void); /* * ckbool.c Index: src/usr.bin/xlint/lint1/lex.c diff -u src/usr.bin/xlint/lint1/lex.c:1.225 src/usr.bin/xlint/lint1/lex.c:1.226 --- src/usr.bin/xlint/lint1/lex.c:1.225 Thu May 9 11:08:07 2024 +++ src/usr.bin/xlint/lint1/lex.c Sun May 12 08:48:36 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lex.c,v 1.225 2024/05/09 11:08:07 rillig Exp $ */ +/* $NetBSD: lex.c,v 1.226 2024/05/12 08:48:36 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: lex.c,v 1.225 2024/05/09 11:08:07 rillig Exp $"); +__RCSID("$NetBSD: lex.c,v 1.226 2024/05/12 08:48:36 rillig Exp $"); #endif #include <ctype.h> @@ -468,15 +468,15 @@ lex_keyword(sym_t *sym) * member, tag, ...). */ extern int -lex_name(const char *yytext, size_t yyleng) +lex_name(const char *text, size_t len) { - sym_t *sym = symtab_search(yytext); + sym_t *sym = symtab_search(text); if (sym != NULL && sym->s_keyword != NULL) return lex_keyword(sym); sbuf_t *sb = xmalloc(sizeof(*sb)); - sb->sb_len = yyleng; + sb->sb_len = len; sb->sb_sym = sym; yylval.y_name = sb; @@ -486,8 +486,8 @@ lex_name(const char *yytext, size_t yyle return sym->s_scl == TYPEDEF ? T_TYPENAME : T_NAME; } - char *name = block_zero_alloc(yyleng + 1, "string"); - (void)memcpy(name, yytext, yyleng + 1); + char *name = block_zero_alloc(len + 1, "string"); + (void)memcpy(name, text, len + 1); sb->sb_name = name; return T_NAME; } @@ -547,10 +547,9 @@ integer_constant_type_unsigned(unsigned } int -lex_integer_constant(const char *yytext, size_t yyleng, int base) +lex_integer_constant(const char *text, size_t len, int base) { - const char *cp = yytext; - size_t len = yyleng; + const char *cp = text; /* skip 0[xX] or 0[bB] */ if (base == 16 || base == 2) { @@ -627,10 +626,9 @@ convert_integer(int64_t si, tspec_t t, u } int -lex_floating_constant(const char *yytext, size_t yyleng) +lex_floating_constant(const char *text, size_t len) { - const char *cp = yytext; - size_t len = yyleng; + const char *cp = text; bool imaginary = cp[len - 1] == 'i'; if (imaginary) @@ -1072,9 +1070,9 @@ set_csrc_pos(void) * # lineno "filename" [GCC-flag...] */ void -lex_directive(const char *yytext) +lex_directive(const char *text) { - const char *p = yytext + 1; /* skip '#' */ + const char *p = text + 1; /* skip '#' */ while (*p == ' ' || *p == '\t') p++; @@ -1511,6 +1509,78 @@ pushdown(const sym_t *sym) return nsym; } +static void +fill_token(int tk, const char *text, token *tok) +{ + switch (tk) { + case T_NAME: + case T_TYPENAME: + tok->kind = TK_IDENTIFIER; + tok->u.identifier = xstrdup(yylval.y_name->sb_name); + break; + case T_CON: + tok->kind = TK_CONSTANT; + tok->u.constant = *yylval.y_val; + break; + case T_NAMED_CONSTANT: + tok->kind = TK_IDENTIFIER; + tok->u.identifier = xstrdup(text); + break; + case T_STRING:; + tok->kind = TK_STRING_LITERALS; + tok->u.string_literals.len = yylval.y_string->len; + tok->u.string_literals.cap = yylval.y_string->cap; + tok->u.string_literals.data = xstrdup(yylval.y_string->data); + break; + default: + tok->kind = TK_PUNCTUATOR; + tok->u.punctuator = xstrdup(text); + } +} + +static void +seq_reserve(balanced_token_sequence *seq) +{ + if (seq->len >= seq->cap) { + seq->cap = 16 + 2 * seq->cap; + const balanced_token *old_tokens = seq->tokens; + balanced_token *new_tokens = block_zero_alloc( + seq->cap * sizeof(*seq->tokens), "balanced_tokens"); + memcpy(new_tokens, old_tokens, + seq->len * sizeof(*seq->tokens)); + seq->tokens = new_tokens; + } +} + +static balanced_token_sequence +read_balanced(int opening) +{ + int closing = opening == T_LPAREN ? T_RPAREN + : opening == T_LBRACK ? T_RBRACK : T_RBRACE; + balanced_token_sequence seq = { NULL, 0, 0 }; + + int tok; + while (tok = yylex(), tok > 0 && tok != closing) { + seq_reserve(&seq); + if (tok == T_LPAREN || tok == T_LBRACK || tok == T_LBRACE) { + seq.tokens[seq.len].kind = tok == T_LPAREN ? '(' + : tok == T_LBRACK ? '[' : '{'; + seq.tokens[seq.len].u.tokens = read_balanced(tok); + } else { + fill_token(tok, yytext, &seq.tokens[seq.len].u.token); + freeyyv(&yylval, tok); + } + seq.len++; + } + return seq; +} + +balanced_token_sequence +lex_balanced(void) +{ + return read_balanced(T_LPAREN); +} + /* * Free any dynamically allocated memory referenced by * the value stack or yylval. Index: src/usr.bin/xlint/lint1/scan.l diff -u src/usr.bin/xlint/lint1/scan.l:1.141 src/usr.bin/xlint/lint1/scan.l:1.142 --- src/usr.bin/xlint/lint1/scan.l:1.141 Sat May 11 16:12:28 2024 +++ src/usr.bin/xlint/lint1/scan.l Sun May 12 08:48:36 2024 @@ -1,5 +1,5 @@ %{ -/* $NetBSD: scan.l,v 1.141 2024/05/11 16:12:28 rillig Exp $ */ +/* $NetBSD: scan.l,v 1.142 2024/05/12 08:48:36 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: scan.l,v 1.141 2024/05/11 16:12:28 rillig Exp $"); +__RCSID("$NetBSD: scan.l,v 1.142 2024/05/12 08:48:36 rillig Exp $"); #endif #include "lint1.h" @@ -49,6 +49,7 @@ EXP ([eE][+-]?[0-9]+) PEXP (p[+-]?[0-9A-Fa-f]+) FSUF ([fFlL]?[i]?) +%pointer %option nounput %%