From eb8c972648c9fec8bad5419eb1ab13cafa52d3d8 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 20 Mar 1997 19:45:51 +0000 Subject: [PATCH] Ka-Ping Yee's version is better: 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 | 147 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 113 insertions(+), 34 deletions(-) diff --git a/Lib/keyword.py b/Lib/keyword.py index acee8ff7751..83bb9a9046c 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()