diff --git a/Lib/keyword.py b/Lib/keyword.py
index acee8ff..83bb9a9 100755
--- a/Lib/keyword.py
+++ b/Lib/keyword.py
@@ -1,37 +1,116 @@
-"""Export the list of Python keywords (reserved words)."""
+#! /usr/bin/env python
+#
+#  Keywords (from "graminit.c")
+#
+#  This file is automatically generated; please don't muck it up!
+#
+#  To update the symbols in this file, 'cd' to the top directory of
+#  the python source tree after building the interpreter and run:
+#
+#    PYTHONPATH=./Lib ./python Lib/keyword.py
+#
+#  (this path allows the import of string.py and regexmodule.so
+#  for a site with no installation in place)
 
-# grep '{1, "' ../Python/graminit.c | sed 's/.*"\(.*\)".*/    "\1",/' | sort
+kwlist = [
+#--start keywords--
+        'and',
+        'break',
+        'class',
+        'continue',
+        'def',
+        'del',
+        'elif',
+        'else',
+        'except',
+        'exec',
+        'finally',
+        'for',
+        'from',
+        'global',
+        'if',
+        'import',
+        'in',
+        'is',
+        'lambda',
+        'not',
+        'or',
+        'pass',
+        'print',
+        'raise',
+        'return',
+        'try',
+        'while',
+#--end keywords--
+        ]
 
-keywords = [
-    "__assert__",
-    "and",
-    "break",
-    "class",
-    "continue",
-    "def",
-    "del",
-    "elif",
-    "else",
-    "except",
-    "exec",
-    "finally",
-    "for",
-    "from",
-    "global",
-    "if",
-    "import",
-    "in",
-    "is",
-    "lambda",
-    "not",
-    "or",
-    "pass",
-    "print",
-    "raise",
-    "return",
-    "try",
-    "while",
-    ]
+kwdict = {}
+for keyword in kwlist:
+    kwdict[keyword] = 1
 
-if __name__ == '__main__':
-    for k in keywords: print k
+iskeyword = kwdict.has_key
+
+def main():
+    import sys, regex, string
+
+    args = sys.argv[1:]
+    iptfile = args and args[0] or "Python/graminit.c"
+    if len(args) > 1: optfile = args[1]
+    else: optfile = "Lib/keyword.py"
+
+    # scan the source file for keywords
+    try:
+        fp = open(iptfile)
+    except IOError, err:
+        sys.stderr.write("I/O error reading from %s: %s\n" % (optfile, err))
+        sys.exit(1)
+
+    strprog = regex.compile('"\([^"]+\)"')
+    labelprog = regex.compile('static[ \t]+label.*=[ \t]+{')
+    keywordlist = []
+    while 1:
+        line = fp.readline()
+        if not line: break
+        if labelprog.search(line) > -1: break
+    while line:
+        line = fp.readline()
+        if string.find(line, ';') > -1: break
+        if strprog.search(line) > -1: keywordlist.append(strprog.group(1))
+    fp.close()
+
+    keywordlist.sort()
+    keywordlist.remove("EMPTY")
+
+    # load the output skeleton from the target
+    try:
+        fp = open(optfile)
+        format = fp.readlines()
+        fp.close()
+    except IOError, err:
+        sys.stderr.write("I/O error reading from %s: %s\n" % (optfile, err))
+        sys.exit(2)
+
+    try:
+        start = format.index("#--start keywords--\n") + 1
+        end = format.index("#--end keywords--\n")
+    except ValueError:
+        sys.stderr.write("target does not contain format markers\n")
+        sys.exit(3)
+
+    # insert the lines of keywords
+    lines = []
+    for keyword in keywordlist:
+        lines.append("        '" + keyword + "',\n")
+    format[start:end] = lines
+
+    # write the output file
+    try:
+        fp = open(optfile, 'w')
+    except IOError, err:
+        sys.stderr.write("I/O error writing to %s: %s\n" % (optfile, err))
+        sys.exit(4)
+    fp.write(string.join(format, ''))
+    fp.close()
+
+if __name__ == "__main__":
+    main()
