From 7d4ecfcb3e91f3b45e94b9e64c7c40f1bbd22aa8 Mon Sep 17 00:00:00 2001 From: John Naylor Date: Fri, 12 Aug 2022 15:45:24 +0700 Subject: [PATCH v201 2/9] Build booscanner.c standalone --- src/backend/bootstrap/.gitignore | 1 + src/backend/bootstrap/Makefile | 11 +++++- src/backend/bootstrap/bootparse.y | 2 - src/backend/bootstrap/bootscanner.l | 57 +++++++++++++++-------------- 4 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/backend/bootstrap/.gitignore b/src/backend/bootstrap/.gitignore index 1ffe8ca39e..6351b920fd 100644 --- a/src/backend/bootstrap/.gitignore +++ b/src/backend/bootstrap/.gitignore @@ -1,2 +1,3 @@ +/bootparse.h /bootparse.c /bootscanner.c diff --git a/src/backend/bootstrap/Makefile b/src/backend/bootstrap/Makefile index 6421efb227..c39eb7089c 100644 --- a/src/backend/bootstrap/Makefile +++ b/src/backend/bootstrap/Makefile @@ -14,12 +14,19 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) OBJS = \ bootparse.o \ + bootscanner.o \ bootstrap.o include $(top_srcdir)/src/backend/common.mk -# bootscanner is compiled as part of bootparse -bootparse.o: bootscanner.c +# See notes in src/backend/parser/Makefile about the following two rules +bootparse.h: bootparse.c + touch $@ + +bootparse.c: BISONFLAGS += -d + +# Force these dependencies to be known even without dependency info built: +bootparse.o bootscan.o: bootparse.h # bootparse.c and bootscanner.c are in the distribution tarball, so # they are not cleaned here. diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y index 7d7655d295..c45ddde67f 100644 --- a/src/backend/bootstrap/bootparse.y +++ b/src/backend/bootstrap/bootparse.y @@ -488,5 +488,3 @@ boot_ident: | XNULL { $$ = pstrdup($1); } ; %% - -#include "bootscanner.c" diff --git a/src/backend/bootstrap/bootscanner.l b/src/backend/bootstrap/bootscanner.l index 3094ccb93f..3f916fbb93 100644 --- a/src/backend/bootstrap/bootscanner.l +++ b/src/backend/bootstrap/bootscanner.l @@ -1,4 +1,4 @@ -%{ +%top{ /*------------------------------------------------------------------------- * * bootscanner.l @@ -18,8 +18,11 @@ #include "bootstrap/bootstrap.h" #include "utils/guc.h" -/* Not needed now that this file is compiled as part of bootparse. */ -/* #include "bootparse.h" */ +/* XXX must be included after bootstrap.h */ +#include "bootparse.h" +} + +%{ /* LCOV_EXCL_START */ @@ -52,7 +55,7 @@ id [-A-Za-z0-9_]+ sid \'([^']|\'\')*\' /* - * Keyword tokens return the keyword text (as a constant string) in yylval.kw, + * Keyword tokens return the keyword text (as a constant string) in boot_yylval.kw, * just in case that's needed because we want to treat the keyword as an * unreserved identifier. Note that _null_ is not treated as a keyword * for this purpose; it's the one "reserved word" in the bootstrap syntax. @@ -60,23 +63,23 @@ sid \'([^']|\'\')*\' * Notice that all the keywords are case-sensitive, and for historical * reasons some must be upper case. * - * String tokens return a palloc'd string in yylval.str. + * String tokens return a palloc'd string in boot_yylval.str. */ %% -open { yylval.kw = "open"; return OPEN; } +open { boot_yylval.kw = "open"; return OPEN; } -close { yylval.kw = "close"; return XCLOSE; } +close { boot_yylval.kw = "close"; return XCLOSE; } -create { yylval.kw = "create"; return XCREATE; } +create { boot_yylval.kw = "create"; return XCREATE; } -OID { yylval.kw = "OID"; return OBJ_ID; } -bootstrap { yylval.kw = "bootstrap"; return XBOOTSTRAP; } -shared_relation { yylval.kw = "shared_relation"; return XSHARED_RELATION; } -rowtype_oid { yylval.kw = "rowtype_oid"; return XROWTYPE_OID; } +OID { boot_yylval.kw = "OID"; return OBJ_ID; } +bootstrap { boot_yylval.kw = "bootstrap"; return XBOOTSTRAP; } +shared_relation { boot_yylval.kw = "shared_relation"; return XSHARED_RELATION; } +rowtype_oid { boot_yylval.kw = "rowtype_oid"; return XROWTYPE_OID; } -insert { yylval.kw = "insert"; return INSERT_TUPLE; } +insert { boot_yylval.kw = "insert"; return INSERT_TUPLE; } _null_ { return NULLVAL; } @@ -90,25 +93,25 @@ _null_ { return NULLVAL; } ^\#[^\n]* ; /* drop everything after "#" for comments */ -declare { yylval.kw = "declare"; return XDECLARE; } -build { yylval.kw = "build"; return XBUILD; } -indices { yylval.kw = "indices"; return INDICES; } -unique { yylval.kw = "unique"; return UNIQUE; } -index { yylval.kw = "index"; return INDEX; } -on { yylval.kw = "on"; return ON; } -using { yylval.kw = "using"; return USING; } -toast { yylval.kw = "toast"; return XTOAST; } -FORCE { yylval.kw = "FORCE"; return XFORCE; } -NOT { yylval.kw = "NOT"; return XNOT; } -NULL { yylval.kw = "NULL"; return XNULL; } +declare { boot_yylval.kw = "declare"; return XDECLARE; } +build { boot_yylval.kw = "build"; return XBUILD; } +indices { boot_yylval.kw = "indices"; return INDICES; } +unique { boot_yylval.kw = "unique"; return UNIQUE; } +index { boot_yylval.kw = "index"; return INDEX; } +on { boot_yylval.kw = "on"; return ON; } +using { boot_yylval.kw = "using"; return USING; } +toast { boot_yylval.kw = "toast"; return XTOAST; } +FORCE { boot_yylval.kw = "FORCE"; return XFORCE; } +NOT { boot_yylval.kw = "NOT"; return XNOT; } +NULL { boot_yylval.kw = "NULL"; return XNULL; } {id} { - yylval.str = pstrdup(yytext); + boot_yylval.str = pstrdup(yytext); return ID; } {sid} { /* strip quotes and escapes */ - yylval.str = DeescapeQuotedString(yytext); + boot_yylval.str = DeescapeQuotedString(yytext); return ID; } @@ -121,7 +124,7 @@ NULL { yylval.kw = "NULL"; return XNULL; } /* LCOV_EXCL_STOP */ void -yyerror(const char *message) +boot_yyerror(const char *message) { elog(ERROR, "%s at line %d", message, yyline); } -- 2.36.1