]> granicus.if.org Git - python/commitdiff
Ka-Ping Yee's version is better:
authorGuido van Rossum <guido@python.org>
Thu, 20 Mar 1997 19:45:51 +0000 (19:45 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 20 Mar 1997 19:45:51 +0000 (19:45 +0000)
Here's a "keyword" module which, in the spirit of "token.py", updates
the list of keywords automatically from a source file (in this case,
"graminit.c" seemed like a reasonable choice, easier than "Grammar/Grammar").

You get "kwlist", a sorted list of keywords; "kwdict", a dictionary
mapping each keyword to 1; and "iskeyword", a function which tells
you if a given string happens to be a keyword.

Lib/keyword.py

index acee8ff7751295bae91cd591e8050d8acbbc7a37..83bb9a9046c155468d5ebf7c6355b33d0f459cf8 100755 (executable)
-"""Export the list of Python keywords (reserved words)."""
-
-# grep '{1, "' ../Python/graminit.c | sed 's/.*"\(.*\)".*/    "\1",/' | sort
-
-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",
-    ]
-
-if __name__ == '__main__':
-    for k in keywords: print k
+#! /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)
+
+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--
+        ]
+
+kwdict = {}
+for keyword in kwlist:
+    kwdict[keyword] = 1
+
+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()