############################################################################
#
# 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
This page produced by UniDoc on 2021/04/15 @ 23:59:44.