diff --exclude CVS -ruN pgsql/src/interfaces/ecpg/preproc/Makefile pgsql/src.mm/interfaces/ecpg/preproc/Makefile
--- pgsql/src/interfaces/ecpg/preproc/Makefile	2008-11-14 11:01:55.000000000 +0100
+++ pgsql/src.mm/interfaces/ecpg/preproc/Makefile	2008-11-14 10:59:44.000000000 +0100
@@ -52,6 +52,9 @@
 	@$(missing) flex $< $@
 endif
 
+$(srcdir)/preproc.y: $(top_srcdir)/src/backend/parser/gram.y
+	$(PERL) $(srcdir)/parse.pl $(srcdir) < $< > $@ 
+
 ecpg_keywords.o c_keywords.o keywords.o preproc.o parser.o: preproc.h
 
 # instead of maintaining our own list, take the one from the backend
diff --exclude CVS -ruN pgsql/src/tools/msvc/Solution.pm pgsql/src.mm/tools/msvc/Solution.pm
--- pgsql/src/tools/msvc/Solution.pm	2008-08-17 09:09:16.000000000 +0200
+++ pgsql/src.mm/tools/msvc/Solution.pm	2008-11-13 15:15:50.000000000 +0100
@@ -239,6 +239,19 @@
 
     if (
         IsNewer(
+            'src\interfaces\ecpg\preproc\preproc.y',
+            'src\backend\parser\gram.y'
+        )
+      )
+    {
+        print "Generating preproc.y...\n";
+        chdir('src\interfaces\ecpg\preproc');
+        system('perl parse.pl . < ..\..\..\backend\parser\gram.y > preproc.y');
+        chdir('..\..\..\..');
+    }
+
+    if (
+        IsNewer(
             'src\interfaces\ecpg\include\ecpg_config.h',
             'src\interfaces\ecpg\include\ecpg_config.h.in'
         )
