]> granicus.if.org Git - postgresql/commitdiff
Build backend/parser/scan.l and interfaces/ecpg/preproc/pgc.l standalone.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 19 Mar 2016 16:07:16 +0000 (12:07 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 19 Mar 2016 16:07:24 +0000 (12:07 -0400)
Now that we know about the %top{} trick, we can revert to building flex
lexers as separate .o files.  This is worth doing for a couple of reasons
besides sheer cleanliness.  We can narrow the scope of the -Wno-error flag
that's forced on scan.c.  Also, since these grammar and lexer files are
so large, splitting them into separate build targets should have some
advantages in build speed, particularly in parallel or ccache'd builds.

We have quite a few other .l files that could be changed likewise, but the
above arguments don't apply to them, so the benefit of fixing them seems
pretty minimal.  Leave the rest for some other day.

src/backend/parser/Makefile
src/backend/parser/gram.y
src/backend/parser/scan.l
src/interfaces/ecpg/preproc/Makefile
src/interfaces/ecpg/preproc/ecpg.trailer
src/interfaces/ecpg/preproc/pgc.l

index 0395bd5934afc480a2fa93dd5172cb206ece0197..9cc8946fa1bc3480b68ae0eedf0e8a77691187bd 100644 (file)
@@ -12,7 +12,7 @@ include $(top_builddir)/src/Makefile.global
 
 override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 
-OBJS= analyze.o gram.o keywords.o kwlookup.o parser.o \
+OBJS= analyze.o gram.o scan.o keywords.o kwlookup.o parser.o \
       parse_agg.o parse_clause.o parse_coerce.o parse_collate.o parse_cte.o \
       parse_expr.o parse_func.o parse_node.o parse_oper.o parse_param.o \
       parse_relation.o parse_target.o parse_type.o parse_utilcmd.o scansup.o
@@ -20,12 +20,9 @@ OBJS= analyze.o gram.o keywords.o kwlookup.o parser.o \
 include $(top_srcdir)/src/backend/common.mk
 
 
-# scan is compiled as part of gram
-gram.o: scan.c
-
 # Latest flex causes warnings in this file.
 ifeq ($(GCC),yes)
-gram.o: CFLAGS += -Wno-error
+scan.o: CFLAGS += -Wno-error
 endif
 
 
@@ -47,7 +44,7 @@ scan.c: FLEX_NO_BACKUP=yes
 
 
 # Force these dependencies to be known even without dependency info built:
-gram.o keywords.o parser.o: gram.h
+gram.o scan.o keywords.o parser.o: gram.h
 
 
 # gram.c, gram.h, and scan.c are in the distribution tarball, so they
index b9aeb3171f7e567069d85e4da86aaaed638fe3f7..a74fb772e1496fcad618d16dcfca4491db618db9 100644 (file)
@@ -14908,13 +14908,3 @@ parser_init(base_yy_extra_type *yyext)
 {
        yyext->parsetree = NIL;         /* in case grammar forgets to set it */
 }
-
-/*
- * Must undefine this stuff before including scan.c, since it has different
- * definitions for these macros.
- */
-#undef yyerror
-#undef yylval
-#undef yylloc
-
-#include "scan.c"
index 69def847376113de07b3b02d050575d7ba1d9dc0..d6322766c7d3a340197f57a5b0963267b8f33183 100644 (file)
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * scan.l
@@ -6,7 +6,7 @@
  *
  * NOTE NOTE NOTE:
  *
- * The rules in this file must be kept in sync with psql's lexer!!!
+ * The rules in this file must be kept in sync with psql's psqlscan.l!
  *
  * The rules are designed so that the scanner never has to backtrack,
  * in the sense that there is always a rule that can match the input
 #include <ctype.h>
 #include <unistd.h>
 
+#include "parser/gramparse.h"
 #include "parser/parser.h"                             /* only needed for GUC variables */
-#include "parser/scanner.h"
 #include "parser/scansup.h"
 #include "mb/pg_wchar.h"
+}
 
-
+%{
 /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
 #undef fprintf
 #define fprintf(file, fmt, msg)  fprintf_to_ereport(fmt, msg)
index ca13c1faa88cf26614f5dc0d8b52fbeaced1ecac..ee3b13a4afa0762547fbfe07ebd9110a65142906 100644 (file)
@@ -26,7 +26,7 @@ override CPPFLAGS := -I../include -I$(top_srcdir)/src/interfaces/ecpg/include \
 
 override CFLAGS += $(PTHREAD_CFLAGS) -DECPG_COMPILE
 
-OBJS=  preproc.o type.o ecpg.o output.o parser.o \
+OBJS=  preproc.o pgc.o type.o ecpg.o output.o parser.o \
        keywords.o c_keywords.o ecpg_keywords.o kwlookup.o ../ecpglib/typename.o descriptor.o variable.o \
        $(WIN32RES)
 
@@ -44,9 +44,6 @@ ecpg: $(OBJS) | submake-libpgport
 ../ecpglib/typename.o: ../ecpglib/typename.c
        $(MAKE) -C $(dir $@) $(notdir $@)
 
-# pgc is compiled as part of preproc
-preproc.o: pgc.c
-
 preproc.h: preproc.c ;
 preproc.c: BISONFLAGS += -d
 
@@ -54,7 +51,7 @@ preproc.y: ../../../backend/parser/gram.y parse.pl ecpg.addons ecpg.header ecpg.
        $(PERL) $(srcdir)/parse.pl $(srcdir) < $< > $@
        $(PERL) $(srcdir)/check_rules.pl $(srcdir) $<
 
-ecpg_keywords.o c_keywords.o keywords.o preproc.o parser.o: preproc.h
+ecpg_keywords.o c_keywords.o keywords.o preproc.o pgc.o parser.o: preproc.h
 
 kwlookup.c: % : $(top_srcdir)/src/backend/parser/%
        rm -f $@ && $(LN_S) $< .
index 16359a309b7b9d1e613130892d76c493137d2fa0..de0df7440f0cb02a0c08dbd6ed877e8905b4d4e7 100644 (file)
@@ -1916,11 +1916,3 @@ void parser_init(void)
 {
  /* This function is empty. It only exists for compatibility with the backend parser right now. */
 }
-
-/*
- * Must undefine base_yylex before including pgc.c, since we want it
- * to create the function base_yylex not filtered_base_yylex.
- */
-#undef base_yylex
-
-#include "pgc.c"
index 397f14ef26fe6d4525a619db7dc41fcfc8b63e71..ec71bbd2afb50ae68c2a7d72bfef516df8c80634 100644 (file)
@@ -1,4 +1,4 @@
-%{
+%top{
 /*-------------------------------------------------------------------------
  *
  * pgc.l
 #include <limits.h>
 
 #include "extern.h"
+#include "preproc.h"
+
+/*
+ * Change symbol names as expected by preproc.l.  It'd be better to do this
+ * with %option prefix="base_yy", but that affects some other names that
+ * various files expect *not* to be prefixed with "base_".  Cleaning it up
+ * is not worth the trouble right now.
+ */
+#define yylex           base_yylex
+#define yylval          base_yylval
+}
 
+%{
 extern YYSTYPE yylval;
 
 static int             xcdepth = 0;    /* depth of nesting in slash-star comments */