diff --git a/Misc/NEWS b/Misc/NEWS
index 9c77b8c08093a639482eda046b5e8cc319fbbf90..b60384119fea6a6dbab87c3509ab0041b1dc4d1b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -306,6 +306,8 @@ C-API
 Extension Modules
 -----------------
 
+- Issue #4279: Fix build of parsermodule under Cygwin.
+
 - Issue #4051: Prevent conflict of UNICODE macros in cPickle.
 
 - Issue #4228: Pack negative values the same way as 2.4 in struct's L format.
diff --git a/Parser/printgrammar.c b/Parser/printgrammar.c
index ec8f4daa4ef45e40e32e98242fdb9c31805434d5..ae180e11f2ea89bf67aed6214e13bbc63f6de5f2 100644
--- a/Parser/printgrammar.c
+++ b/Parser/printgrammar.c
@@ -16,6 +16,7 @@ printgrammar(grammar *g, FILE *fp)
 	fprintf(fp, "/* Generated by Parser/pgen */\n\n");
 	fprintf(fp, "#include \"pgenheaders.h\"\n");
 	fprintf(fp, "#include \"grammar.h\"\n");
+	fprintf(fp, "PyAPI_DATA(grammar) _PyParser_Grammar;\n");
 	printdfas(g, fp);
 	printlabels(g, fp);
 	fprintf(fp, "grammar _PyParser_Grammar = {\n");
diff --git a/Python/graminit.c b/Python/graminit.c
index e65a992a648585fc43a64985f0d73e27c6eee7bb..ec2f4215f4caa091bbe18493e3caf291d03af439 100644
--- a/Python/graminit.c
+++ b/Python/graminit.c
@@ -2,6 +2,7 @@
 
 #include "pgenheaders.h"
 #include "grammar.h"
+PyAPI_DATA(grammar) _PyParser_Grammar;
 static arc arcs_0_0[3] = {
 	{2, 1},
 	{3, 1},