summaryrefslogtreecommitdiffstats
path: root/Lib/keyword.py
blob: 340b5c858bc85771a1b64cc3f4d692c85e720f2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#! /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--
        '__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',
#--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()