mkaliases.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #! /usr/bin/env python2.7
  2. #
  3. # Alexander Shiryaev, 2012.10
  4. import sys
  5. import string
  6. def loadMap (fh):
  7. r = {}
  8. fix = {}
  9. rfix = {}
  10. ident = 0
  11. while True:
  12. line = fh.readline()
  13. if line == '':
  14. break
  15. line = line.strip()
  16. if (len(line) > 0) and (line[0] != '#'):
  17. t, fs = string.split(line, ':', maxsplit=1)
  18. t = t.rstrip()
  19. fs = fs.lstrip()
  20. fs = fs.split()
  21. for f in fs:
  22. assert not r.has_key(f)
  23. x = fix.get(t)
  24. if x == None:
  25. x = ident
  26. ident = ident + 1
  27. fix[t] = x
  28. rfix[x] = t
  29. r[f] = x
  30. return r, rfix
  31. def mkTree (m):
  32. r = {}
  33. for f, t in m.iteritems():
  34. n = r
  35. i = 0
  36. while i < len(f):
  37. c = f[i]
  38. n = n.setdefault(c, {})
  39. i = i + 1
  40. assert not n.has_key(0)
  41. n[0] = t
  42. return r
  43. def gen0 (t,level, n):
  44. assert len(t) > 0
  45. r = []
  46. if len(t) == 1:
  47. if t.has_key(0):
  48. r.append('%sIF s[%d] = 0X THEN x := %d END' % ('\t'*n, level, t[0]))
  49. else:
  50. k = t.keys()[0]
  51. r.append("%sIF s[%d] = '%c' THEN" % ('\t'*n, level, k))
  52. r.append(gen0(t[k], level+1, n+1))
  53. r.append("%sEND" % ('\t'*n))
  54. else:
  55. r.append("%sCASE s[%d] OF" % ('\t'*n, level))
  56. for k, v in t.iteritems():
  57. if k != 0:
  58. r.append("%s| '%c':" % ('\t'*n, k))
  59. r.append(gen0(v, level+1, n+1))
  60. else:
  61. r.append('%s| 0X: x := %d' % ('\t'*n, v))
  62. r.append("%sELSE END" % ('\t'*n,))
  63. return '\n'.join(r)
  64. def gen (t, rfix):
  65. fixS = []
  66. for k, v in rfix.iteritems():
  67. fixS.append('\t| %d: r := modPrefix + "%s"' % (k, string.replace(v.lower(), '-', '_')))
  68. return """MODULE EncStdAliases;
  69. (* Generated automatically *)
  70. CONST
  71. modPrefix = "EncStdMap_";
  72. PROCEDURE GetModName* (s: ARRAY OF CHAR; OUT r: ARRAY OF CHAR; OUT ok: BOOLEAN);
  73. VAR x: INTEGER;
  74. BEGIN
  75. x := 0;
  76. WHILE (x < LEN(s)) & (s[x] # 0X) DO
  77. IF (s[x] >= 'a') & (s[x] <= 'z') THEN
  78. s[x] := CHR(ORD(s[x]) - ORD('a') + ORD('A'))
  79. END;
  80. INC(x)
  81. END;
  82. x := -1;
  83. %s;
  84. ok := TRUE;
  85. CASE x OF -1: ok := FALSE
  86. %s
  87. END
  88. END GetModName;
  89. END EncStdAliases.""" % (gen0(t, 0, 1), '\n'.join(fixS))
  90. def main ():
  91. m, rfix = loadMap(sys.stdin)
  92. sys.stdout.write(gen(mkTree(m), rfix))
  93. if __name__ == '__main__':
  94. main()