• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #! /usr/bin/env python3
2 # This script generates the symbol.py source file.
3 
4 import sys
5 import re
6 
7 def main(inFileName="Include/graminit.h", outFileName="Lib/symbol.py"):
8     try:
9         fp = open(inFileName)
10     except OSError as err:
11         sys.stderr.write("I/O error: %s\n" % str(err))
12         sys.exit(1)
13     with fp:
14         lines = fp.read().split("\n")
15     prog = re.compile(
16         "#define[ \t][ \t]*([A-Z0-9][A-Z0-9_]*)[ \t][ \t]*([0-9][0-9]*)",
17         re.IGNORECASE)
18     tokens = {}
19     for line in lines:
20         match = prog.match(line)
21         if match:
22             name, val = match.group(1, 2)
23             val = int(val)
24             tokens[val] = name          # reverse so we can sort them...
25     keys = sorted(tokens.keys())
26     # load the output skeleton from the target:
27     try:
28         fp = open(outFileName)
29     except OSError as err:
30         sys.stderr.write("I/O error: %s\n" % str(err))
31         sys.exit(2)
32     with fp:
33         format = fp.read().split("\n")
34     try:
35         start = format.index("#--start constants--") + 1
36         end = format.index("#--end constants--")
37     except ValueError:
38         sys.stderr.write("target does not contain format markers")
39         sys.exit(3)
40     lines = []
41     for val in keys:
42         lines.append("%s = %d" % (tokens[val], val))
43     format[start:end] = lines
44     try:
45         fp = open(outFileName, 'w')
46     except OSError as err:
47         sys.stderr.write("I/O error: %s\n" % str(err))
48         sys.exit(4)
49     with fp:
50         fp.write("\n".join(format))
51 
52 if __name__ == '__main__':
53     main(*sys.argv[1:])
54