summaryrefslogtreecommitdiff
path: root/ipl/procs/gen.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/procs/gen.icn')
-rw-r--r--ipl/procs/gen.icn445
1 files changed, 445 insertions, 0 deletions
diff --git a/ipl/procs/gen.icn b/ipl/procs/gen.icn
new file mode 100644
index 0000000..375c4c5
--- /dev/null
+++ b/ipl/procs/gen.icn
@@ -0,0 +1,445 @@
+############################################################################
+#
+# File: gen.icn
+#
+# Subject: Procedures for meta-variant code generation
+#
+# Author: Ralph E. Griswold
+#
+# Date: April 30, 1993
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# These procedures are for use with code produced by a meta-variant
+# translator. As given here, they produce an identity translation.
+# Modifications can be made to effect variant translations.
+#
+############################################################################
+
+# main() calls program(), which is produced by the meta-variant
+# translation.
+
+procedure main()
+
+ program()
+
+end
+
+procedure Alt_(e1, e2) # e1 | e2
+
+ return "(" || e1 || "|" || e2 || ")"
+
+end
+
+procedure Apply_(e1, e2) # e1 ! e2
+
+ return "(" || e1 || "!" || e2 || ")"
+
+end
+
+procedure Asgnop_(op, e1, e2) # e1 op e2
+
+ return "(" || e1 || " " || op || " " || | e2 || ")"
+
+end
+
+procedure Augscan_(e1, e2) # e1 ?:= e2
+
+ return "(" || e1 || " ?:= " || e2 || ")"
+
+end
+
+procedure Bamper_(e1, e2) # e1 & e2
+
+ return "(" || e1 || " & " || e2 || ")"
+
+end
+
+procedure Binop_(op, e1, e2) # e1 op e2
+
+ return "(" || e1 || " " || op || " " || e2 || ")"
+
+end
+
+procedure Break_(e) # break e
+
+ return "break " || e
+
+end
+
+procedure Case_(e, clist) # case e of { caselist }
+
+ return "case " || e || " of {" || clist || "}"
+
+end
+
+procedure Cclause_(e1, e2) # e1 : e2
+
+ return e1 || " : " || e2 || "\n"
+
+end
+
+procedure Clist_(e1, e2) # e1 ; e2 in case list
+
+ return e1 || ";" || e2
+
+end
+
+procedure Clit_(e) # 's'
+
+ return "'" || e || "'"
+
+end
+
+procedure Compound_(es[]) # { e1; e2; ... }
+ local result
+
+ if *es = 0 then return "{}\n"
+
+ result := "{\n"
+ every result ||:= !es || "\n"
+
+ return result || "}\n"
+
+end
+
+procedure Create_(e) # create e
+
+ return "create " || e
+
+end
+
+procedure Default_(e) # default: e
+
+ return "default: " || e
+
+end
+
+procedure End_() # end
+
+ write("end")
+
+ return
+
+end
+
+procedure Every_(e) # every e
+
+ return "every " || e
+
+end
+
+procedure Every_Do_(e1, e2) # every e1 do e2
+
+ return "every " || e1 || " do " || e2
+
+end
+
+procedure Fail_() # fail
+
+ return "fail"
+
+end
+
+procedure Field_(e1, e2) # e . f
+
+ return "(" || e1 || "." || e2 || ")"
+
+end
+
+procedure Global_(vs[]) # global v1, v2, ...
+ local result
+
+ result := ""
+ every result ||:= !vs || ", "
+
+ write("global ", result[1:-2])
+
+ return
+
+end
+
+procedure If_(e1, e2) # if e1 then e2
+
+ return "if " || e1 || " then " || e2
+
+end
+
+procedure If_Else_(e1, e2, e3) # if e1 then e2 else e3
+
+ return "if " || e1 || " then " || e2 || " else " || e3
+
+end
+
+procedure Ilit_(e) # i
+
+ return e
+
+end
+
+procedure Initial_(s) # initial e
+
+ write("initial ", s)
+
+ return
+
+end
+
+procedure Invoke_(e0, es[]) # e0(e1, e2, ...)
+ local result
+
+ if *es = 0 then return e0 || "()"
+
+ result := ""
+ every result ||:= !es || ", "
+
+ return e0 || "(" || result[1:-2] || ")"
+
+end
+
+procedure Key_(s) # &s
+
+ return "&" || s
+
+end
+
+procedure Limit_(e1, e2) # e1 \ e2
+
+ return "(" || e1 || "\\" || e2 || ")"
+
+end
+
+procedure Link_(vs) # link "v1, v2, ..." (problem)
+
+ write("link ", vs)
+
+end
+
+procedure List_(es[]) # [e1, e2, ... ]
+ local result
+
+ if *es = 0 then return "[]"
+
+ result := ""
+ every result ||:= !es || ", "
+
+ return "[" || result[1:-2] || "]"
+
+end
+
+procedure Local_(vs[]) # local v1, v2, ...
+ local result
+
+ result := ""
+ every result ||:= !vs || ", "
+
+ write("local ", result[1:-2])
+
+ return
+
+end
+
+procedure Next_() # next
+
+ return "next"
+
+end
+
+procedure Null_() # &null
+
+ return ""
+
+end
+
+procedure Paren_(es[]) # (e1, e2, ... )
+ local result
+
+ if *es = 0 then return "()"
+
+ result := ""
+ every result ||:= !es || ", "
+
+ return "(" || result[1:-2] || ")"
+
+end
+
+procedure Pdco_(e0, es[]) # e0{e1, e2, ... }
+ local result
+
+ if *es = 0 then return e0 || "{}"
+
+ result := ""
+ every result ||:= !es || ", "
+
+ return e0 || "{" || result[1:-2] || "}"
+
+end
+
+procedure Proc_(s, es[]) # procedure s(v1, v2, ...)
+ local result, e
+
+ if *es = 0 then write("procedure ", s, "()")
+
+ result := ""
+ every e := !es do
+ if e == "[]" then result[-2:0] := e || ", "
+ else result ||:= (\e | "") || ", "
+
+ write("procedure ", s, "(", result[1:-2], ")")
+
+ return
+
+end
+
+procedure Record_(s, es[]) # record s(v1, v2, ...)
+ local result, field
+
+ if *es = 0 then write("record ", s, "()")
+
+ result := ""
+ every field := !es do
+ result ||:= (\field | "") || ", "
+
+ write("record ", s, "(", result[1:-2], ")")
+
+ return
+
+end
+
+procedure Reduce_(s[]) # used in code generation
+
+ every write(!s)
+
+ return
+
+end
+
+procedure Repeat_(e) # repeat e
+
+ return "repeat " || e
+
+end
+
+procedure Return_(e) # return e
+
+ return "return " || e
+
+end
+
+procedure Rlit_(e)
+
+ return e
+
+end
+
+procedure Scan_(e1, e2) # e1 ? e2
+
+ return "(" || e1 || " ? " || e2 || ")"
+
+end
+
+procedure Section_(op, e1, e2, e3) # e1[e2 op e3]
+
+ return e1 || "[" || e2 || op || e3 || "]"
+
+end
+
+procedure Slit_(s) # "s"
+
+ return image(s)
+
+end
+
+procedure Static_(ev[]) # static v1, v2, ..
+ local result
+
+ result := ""
+ every result ||:= !ev || ", "
+
+ write("static ", result[1:-2])
+
+ return
+
+end
+
+procedure Subscript_(e1, e2) # e1[e2]
+
+ return e1 || "[" || e2 || "]"
+
+end
+
+procedure Suspend_(e) # suspend e
+
+ return "suspend " || e
+
+end
+
+procedure Suspend_Do_(e1, e2) # suspend e1 do e2
+
+ return "suspend " || e1 || " do " || e2
+
+end
+
+procedure To_(e1, e2) # e1 to e2
+
+ return "(" || e1 || " to " || e2 || ")"
+
+end
+
+procedure To_By_(e1, e2, e3) # e1 to e2 by e3
+
+ return "(" || e1 || " to " || e2 || " by " || e3 || ")"
+
+end
+
+procedure Repalt_(e) # |e
+
+ return "(|" || e || ")"
+
+end
+
+procedure Unop_(op, e) # op e
+
+ return "(" || op || e || ")"
+
+end
+
+procedure Not_(e) # not e
+
+ return "not(" || e || ")"
+
+end
+
+procedure Until_(e) # until e
+
+ return "until " || e
+
+end
+
+procedure Until_Do_(e1, e2) # until e1 do e2
+
+ return "until " || e1 || " do " || e2
+
+end
+
+procedure Var_(s) # v
+
+ return s
+
+end
+
+procedure While_(e) # while e
+
+ return "while " || e
+
+end
+
+procedure While_Do_(e1, e2) # while e1 do e2
+
+ return "while " || e1 || " do " || e2
+
+end