1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
############################################################################
#
# File: emptygen.icn
#
# Subject: Procedures for meta-translation code generation
#
# Author: Ralph E. Griswold
#
# Date: December 5, 1995
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# This program is designed to be linked with the output of the meta-
# translator. As given here, they produce an identity translation.
# Modifications can be made to effect different translations.
#
# The procedures here are just wrappers. This file is a skeleton that
# can be used as a basis for code-generation procedures.
#
############################################################################
#
# Bug: The invocable declaration is not handled properly. "invocable all"
# will get by, but some other forms produce syntax errors. The
# problem is in the meta-translator itself, not in this program.
#
############################################################################
#
# Links: strings
#
############################################################################
link strings
procedure main()
Mp() # call meta-procedure
end
procedure Alt(e1, e2) # e1 | e2
end
procedure Apply(e1, e2) # e1 ! e2
end
procedure Arg(e) # procedure argument (parameter)
end
procedure Asgnop(op, e1, e2) # e1 op e2
end
procedure Augscan(e1, e2) # e1 ?:= e2
end
procedure Bamper(e1, e2) # e1 & e2
end
procedure Binop(op, e1, e2) # e1 op e2
end
procedure Body(es[]) # procedure body
end
procedure Break(e) # break e
end
procedure Case(e, clist) # case e of { caselist }
end
procedure Cclause(e1, e2) # e1 : e2
end
procedure Clist(cclause1, cclause2) # cclause1 ; cclause2
end
procedure Clit(c) # 'c'
end
procedure Compound(es[]) # { e1; e2; ... }
end
procedure Create(e) # create e
end
procedure Default(e) # default: e
end
procedure End() # end
end
procedure Every(e) # every e
end
procedure EveryDo(e1, e2) # every e1 do e2
end
procedure Fail() # fail
end
procedure Field(e, f) # e . f
end
procedure Global(vs[]) # global v1, v2, ...
end
procedure If(e1, e2) # if e1 then e2
end
procedure IfElse(e1, e2, e3) # if e1 then e2 else e3
end
procedure Ilit(i) # i
end
procedure Initial(e) # initial e
end
procedure Invocable(ss[]) # invocable s1, s2, ... (problem)
end
procedure Invoke(e, es[]) # e(e1, e2, ...)
end
procedure Key(s) # &s
end
procedure Limit(e1, e2) # e1 \ e2
end
procedure Link(vs[]) # link "v1, v2, ..."
end
procedure List(es[]) # [e1, e2, ... ]
end
procedure Local(vs[]) # local v1, v2, ...
end
procedure Next() # next
end
procedure Not(e) # not e
end
procedure Null() # &null
end
procedure Paren(es[]) # (e1, e2, ... )
end
procedure Pdco(e, es[]) # e{e1, e2, ... }
end
procedure Proc(n, vs[]) # procedure n(v1, v2, ...)
end
procedure Record(n, fs[]) # record n(f1, f2, ...)
end
procedure Repeat(e) # repeat e
end
procedure Return(e) # return e
end
procedure Rlit(r) # r
end
procedure Scan(e1, e2) # e1 ? e2
end
procedure Section(op, e1, e2, e3) # e1[e2 op e3]
end
procedure Slit(s) # "s"
end
procedure Static(vs[]) # static v1, v2, ..
end
procedure Subscript(e1, e2) # e1[e2]
end
procedure Suspend(e) # suspend e
end
procedure SuspendDo(e1, e2) # suspend e1 do e2
end
procedure To(e1, e2) # e1 to e2
end
procedure ToBy(e1, e2, e3) # e1 to e2 by e3
end
procedure Repalt(e) # |e
end
procedure Unop(op, e) # op e
end
procedure Until(e) # until e
end
procedure UntilDo(e1, e2) # until e1 do e2
end
procedure Var(v) # v
end
procedure While(e) # while e
end
procedure WhileDo(e1, e2) # while e1 do e2
end
|