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.
This commit is contained in:
parent
90d556fb6e
commit
eb8c972648
147
Lib/keyword.py
147
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()
|
||||
|
|
Loading…
Reference in New Issue