tock-mirror/fco/make-passthrough.py

83 lines
1.6 KiB
Python

#!/usr/bin/python
# Generate the base transforms from the data type definition in Tree.
import os, sys, re
def die(*s):
print >>sys.stderr, "Fatal: " + "".join(map(str, s))
sys.exit(1)
def update_def(func, f, newf):
newf.write("\n" + func + " :: Transform st\n")
newf.write(func + " next top node\n")
newf.write(" = case node of\n")
while True:
s = f.readline()
if s == "":
die("Unexpected EOF during Node definition")
elif s.strip().startswith("-- }}} END"):
break
s = s.strip()
if s == "" or s.startswith("--"):
continue
s = s.replace("| ", "")
fields = s.split()
name = "N." + fields[0]
args = fields[1:]
lhs = []
lines = []
rhs = []
i = 1
for arg in args:
n = "a" + str(i)
i += 1
lhs.append(n)
var = "v" + n
if arg == "Node":
lines.append(var + " <- top " + n)
rhs.append(var)
elif arg == "[Node]":
lines.append(var + " <- mapM top " + n)
rhs.append(var)
else:
rhs.append(n)
space = ""
if lhs != []:
space = " "
newf.write(" " + name + space + " ".join(lhs) + " -> do\n")
for l in lines:
newf.write(" " + l + "\n")
newf.write(" return $ " + name + space + " ".join(rhs) + "\n")
newf.write(" _ -> next node\n")
def main():
f = open("Tree.hs")
newf = open("BaseTransforms.hs", "w")
newf.write("""-- Base transforms
-- Automatically generated from Tree.hs -- do not edit!
module BaseTransforms where
import qualified Tree as N
import Pass
import Control.Monad
""")
while 1:
s = f.readline()
if s == "":
break
if s.startswith("-- {{{ BEGIN"):
ss = s.strip().split()
update_def(ss[3], f, newf)
f.close()
newf.close()
main()