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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
|
#type ("prop")##limit (14.0)#
#format#
#page (49)#
#kapitel ("5", "Drucken", "und", "Druckmuster")#
#abschnitt ("5.1", "DRUCKMUSTERSYNTAX", "Druckmustersyntax")#
Ein Druckmuster ist eine Beschreibung für die Form, in der die In
halte einer EUDAS-Datei ausgedruckt werden sollen. Der syntakti
sche Aufbau des Druckmusters ist zeilenorientiert und gehorcht
folgender Syntax:
Druckmuster :
[ Initialisierungsteil ]
[ Vorspann ]
[ Wiederholungsteil ]
[ Nachspann ]
Initialisierungsteil :
( Kommandozeile #char (""124"")# Textzeile )#bsp ("*")#
( GRUPPE-Anweisung #char(""124"")# Textzeile )#bsp ("*")#
Vorspann :
VORSPANN-Anweisung Abschnitt
Wiederholungsteil :
WIEDERHOLUNG-Anweisung Abschnitt
Nachspann :
NACHSPANN-Anweisung Abschnitt
Abschnitt :
Musterteil
[ ABKUERZUNGEN-Anweisung Abkürzungsteil ]
Musterteil :
( Musterzeile #char(""124"")# Kommandozeile #char(""124"")#
MODUS-Anweisung #char (""124"")# MEHR-Anweisung )#bsp ("*")#
Zur Notation: [] bedeutet optional, ()#bsp("*")# beliebig häufige Wiederho
lung, #char(""124"")# Alternative und keine Angabe einfache Aneinanderreihung.
Die verschiedenen Zeilentypen werden weiter unten beschrieben.
Zusätzlich gilt die Bedingung, daß von Vorspann, Wiederho
lungsteil und Nachspann mindestens einer vorhanden sein muß.
#a ("Zeilentypen")# Im Druckmuster gibt es 6 verschiedene Zeilentypen:
#on("i")#Kommandozeilen#off("i")#
Eine Kommandozeile beginnt mit '%%' in der ersten und zweiten
Spalte. Der Inhalt der Zeile ab Spalte 3 wird dem ELAN-Compi
ler übergeben. Die Bedeutung dieser Zeilen ergibt sich aus dem
in 5.4 beschriebenen Übersetzungsmechanismus.
#on("i")#Anweisungen#off("i")#
Anweisungen beginnen mit '%' in der ersten Spalte und dienen
zur Steuerung des Druckgenerators. Der Name der Anweisung
muß in Großbuchstaben und ohne Leerzeichen geschrieben
werden. Davor dürfen sich noch Leerzeichen befinden. An
schließend können noch Parameter folgen, die nur durch Leer
zeichen getrennt aneinander gereiht werden. Die Syntax einer
Anweisung ähnelt der eines Operators in ELAN.
#on("i")#Textzeilen#off("i")#
Textzeilen sind die nicht anderweitig markierten Zeilen im
Initialisierungsteil. Sie werden unverändert an den Anfang
jeder Druckdatei gestellt.
#on("i")#Musterzeilen#off("i")#
Musterzeilen sind nicht besonders gekennzeichnete Zeilen im
Musterteil. Sie enthalten Feldmuster und werden nach dem
Einsetzen von Inhalten in die Ausgabedatei übernommen. Die
Interpretation der Musterzeilen wird in Abschnitt 5.3 beschrie
ben.
#on("i")#Abkürzungszeilen#off("i")#
Abkürzungszeilen markieren den Beginn einer Abkürzung im
Abkürzungsteil eines Abschnittes. Sie werden durch '&' in der
ersten Spalte gekennzeichnet. Darauf folgt ohne Zwischenraum
der Name einer Abkürzung (ohne Leerzeichen) und danach
durch Leerzeichen getrennt ein Semikolon. Der Name der Ab
kürzung wird bei der Übersetzung durch einen Refinementnamen
ersetzt und die Zeile dem ELAN-Compiler übergeben. Der Rest
der Zeile kann also den Beginn eines werteliefernden Refine
ments enthalten.
#on("i")#Programmzeilen#off("i")#
Programmzeilen sind die nicht durch '&' markierten Zeilen im
Abkürzungsteil. Sie werden unverändert an den ELAN-Compiler
übergeben. Der erlaubte Inhalt richtet sich nach dem Überset
zungsmechanismus (5.4).
#abschnitt ("5.2", "DER DRUCKVORGANG", "Der Druckvorgang")#
Der Druckvorgang besteht im wesentlichen darin, daß für alle zu
bearbeitenden Sätze der Wiederholungsteil einmal interpretiert wird
und das Ergebnis in eine Ausgabedatei geschrieben wird, die dann
gedruckt werden kann. Wenn mindestens ein Satz markiert ist, wer
den alle markierten Sätze der virtuellen Datei bearbeitet, ansonsten
alle durch die Suchbedingung erfaßten.
#a ("Gruppen")# Eine #on("i")#Gruppe#off("i")# ist eine Folge von Sätzen, die in einem be
stimmten Merkmal übereinstimmen. Durch eine GRUPPE-Anweisung
der Form
#beispiel#
% GRUPPE n Ausdruck
#text#
werden aufeinanderfolgende Sätze mit gleichem Wert des angegebe
nen Ausdrucks gruppiert. Über die Nummer 'n' kann festgestellt
werden, ob sich das angegebene Merkmal verändert hat. Dies ge
schieht mit der Prozedur
#beispiel#
BOOL PROC gruppenwechsel (INT CONST gruppennr)
#text#
Immer wenn zwischen zwei Sätzen ein Gruppenwechsel stattfindet,
wird beim vorigen Satz der Nachspann und beim folgenden Satz der
Vorspann einmal interpretiert. Dies führt dazu, daß entsprechende
Vorspann- bzw. Nachspannzeilen gedruckt werden.
Vor dem ersten und nach dem letzten zu bearbeitenden Satz
wechseln alle Gruppen, d.h. dort wird immer ein Vorspann bzw.
Nachspann erzeugt.
Ist ein zu interpretierender Abschnitt nicht vorhanden, so wird
an dieser Stelle keine Ausgabe erzeugt. Die Textzeilen des Initali
sierungsteils werden auf jeden Fall bei Beginn des Druckvorganges
in die Ausgabedatei geschrieben. Falls die Ausgabedatei voll ist,
wird eine neue Datei angefangen und die Zeilen des Initialisie
rungsteils erneut an den Anfang gestellt.
#beispiel#
Satz- Gruppen- Ausgabe
nummer merkmal
#free (0.1)#
Initialisierungsteil
-------------------------------------------------
1 x Vorspann
WDH-Teil
2 x WDH-Teil
Nachspann
-------------------------------------------------
3 y Vorspann
WDH-Teil
4 y WDH-Teil
5 y WDH-Teil
Nachspann
-------------------------------------------------
ENDE
#center#Abb. 5-1 Ablauf des Druckvorganges mit Gruppen
#text#
#a ("Spaltendruck")# Normalerweise werden die Ausgaben der einzelnen
Abschnitte hintereinander in der Ausgabedatei plaziert. Durch An
gabe einer Nummer als Parameter in der WIEDERHOLUNG-Anweisung
können auch soviel Spalten wie angegeben nebeneinander gedruckt
werden. Die Spaltenbreite wird dabei durch das Dateilimit (Komman
do 'limit' im Editor) festgelegt. Alternativ kann die Spaltenbreite
auch als zweiter Parameter durch Leerzeichen getrennt angegeben
werden.
Vorspann und Nachspann werden jedoch auf jeden Fall wieder
in eine eigene Zeile geschrieben, der Spaltendruck also unterbro
chen.
#abschnitt ("5.3", "INTERPRETATION VON MUSTERZEILEN", "Interpretation von Musterzeilen")#
Musterzeilen können Feldmuster enthalten, die bei der Interpreta
tion durch entsprechende Inhalte ersetzt werden, ehe die Muster
zeile in die Ausgabedatei übernommen wird. Der Beginn eines Feld
musters wird durch ein Musterzeichen ('&' oder '%') markiert. Wo
und wie der Inhalt eingesetzt wird, kann durch folgende Variationen
angegeben werden:
#beispiel#
Typ ! Beispiel ! Position ! Länge ! bündig
----+-----------+------------------------------
1 ! &Name ! fest ! variabel ! links
2 ! %Name ! variabel ! variabel ! links
3 ! &Name&&& ! fest ! fest ! links
4 ! %Name%%% ! variabel ! fest ! links
5 ! &&&Name& ! fest ! fest ! rechts
6 ! %%%Name% ! variabel ! fest ! rechts
#text#
Der in dem Feldmuster angegebene Name muß Name einer Abkür
zung in irgendeinem Abkürzungsteil oder eines Feldes sein. Der
Name darf kein Leerzeichen oder Musterzeichen enthalten. Falls dies
doch der Fall ist, muß der Name in spitze Klammern eingeschlossen
werden.
Bei fester Länge wird bei zu kurzem Inhalt mit Leerzeichen
aufgefüllt, bei zu langem Inhalt abgeschnitten. Bei linksbündigem
Einsetzen geschieht dies an der rechten, sonst an der linken Seite.
Feldmuster variabler Länge können je nach Inhalt dazu führen,
daß der folgende Teil der Musterzeile verschoben wird. Für diesen
Einsetzprozeß gelten die folgenden Regeln:
#a ("Position")# Feldmuster fester Position (mit '&' beginnend) werden
immer in der Position eingesetzt, in der sie stehen. Feldmuster
variabler Position (mit '%' beginnen) können nach rechts verschoben
werden, wenn vorherige Inhalte länger als ihre Muster sind, und
nach links, wenn Modus 1 oder 3 eingestellt ist und vorherige In
halte kürzer sind.
#a ("Länge")# Feldmuster variabler Länge erhalten auf jeden Fall den
Platz, der durch die Länge des Feldmusters reserviert ist. Sind die
Inhalte kürzer, kann der gewonnene Platz als Reserve für andere
Feldmuster verwendet werden; sind die Inhalte länger, so wird der
Inhalt so weit eingesetzt, wie noch Reserve vorhanden ist und der
Rest abgeschnitten.
Muß in ein Feldmuster variabler Länge ein leerer Inhalt einge
setzt werden, so werden beim Drucken auch die auf das Feldmuster
folgenden Leerzeichen unterdrückt, falls vor dem Feldmuster noch
ein Leerzeichen steht oder das Feldmuster in Spalte 1 beginnt.
Feldmuster fester Länge werden immer in ihrer reservierten
Länge eingesetzt. Sie werden im folgenden behandelt wie Feldmuster
variabler Länge, deren Inhalt so lang ist wie das Feldmuster.
#a ("Verteilung")# Die Verteilung der verschiebbaren Feldmuster auf der
Zeile geschieht jeweils in dem Abschnitt zwischen zwei Feldmustern
fester Position bzw. Zeilenanfang oder Zeilenende. Für jeden Ab
schnitt wird festgestellt, wieviel Stellen die Inhalte insgesamt mehr
oder weniger als ihre Muster benötigen.
Der Längenausgleich geschieht zwischen dem letzten Feldmuster
und dem Ende des Abschnitts. Dort wird ein Pufferplatz bestimmt,
der bei Überlänge bis auf ein Leerzeichen verkleinert werden kann
und an dem bei Unterlänge zusätzliche Leerzeichen eingefügt wer
den.
Außer am Pufferplatz wird an keinem Mustertext des Abschnitts
etwas geändert. Zwischentexte zwischen den Feldmustern werden
unverändert übertragen und mit den umgebenden Feldmustern ver
schoben.
Als Pufferplatz wird die erste Lücke hinter dem letzten Feld
muster eines Abschnittes verwendet, die mehr als ein Leerzeichen
enthält. Ist keine solche Lücke vorhanden, wird das Ende des Ab
schnitts verwendet, falls dort ein Leerzeichen steht, und sonst das
Ende des letzten Feldmusters.
Die durch den Pufferplatz und kürzere Inhalte gewonnene Re
serve wird von links an die Feldmuster mit Überlänge verteilt, bis
die Reserve verbraucht ist.
#a ("Zeilende")# Das Zeilenende wird als ein Quasi-Feldmuster mit fester
Position aufgefaßt, das am Limit der Druckmusterdatei steht. Es
sind also keine Einsetzungen möglich, die über das Limit der Datei
hinausgehen. Als Pufferplatz wird hier jedoch die erste Blanklücke
vom Zeilenende her verwendet, damit Mustertexte am Zeilenende
gegebenenfalls stehenbleiben. Ist keine solche Lücke vorhanden, so
wird das Zeilenende als Pufferplatz verwendet.
Obwohl nicht als Pufferplatz ausgewiesen, kann der Raum zwi
schen Zeilenende und Dateilimit als Reserve verwendet werden.
#a ("Modi")# Der Einsetzmechanismus kann durch die MODUS-Anweisung
mit einem Parameter verändert werden. Folgende Modi stehen zur
Verfügung:
#beispiel#
Modus ! Effekt
------+----------------------------------------
1 ! Normalmodus.
! '%'-Feldmuster werden auch
! nach links geschoben.
! Keine Zeilenwiederholung.
------+----------------------------------------
2 ! Tabellenmodus.
! '%'-Feldmuster werden nicht
! nach links geschoben.
! Keine Zeilenwiederholung.
------+----------------------------------------
3 ! Normalmodus mit Zeilenwiederholung.
! '%'-Feldmuster werden auch
! nach links geschoben.
! Zeilenwiederholung ohne Zwischentexte.
------+----------------------------------------
4 ! Tabellenmodus mit Zeilenwiederholung.
! '%'-Feldmuster werden nicht
! nach links geschoben.
! Zeilenwiederholung mit Zwischentexten.
------+----------------------------------------
#text#
Bei Zeilenwiederholung werden Inhalte in einer folgenden Zeile
fortgesetzt, falls sie in der ersten Zeile nicht untergebracht werden
konnten. Dazu wird die Musterzeile mit den Restinhalten erneut
interpretiert. Je nach Modus werden auch die Zwischentexte noch
wiederholt. Der Restinhalt umfaßt immer noch das ganze letzte Wort,
das nicht mehr auf die vorige Zeile paßte. Es findet also ein Um
bruch statt. Die Positionen, die in der vorigen Zeile vom Anfang des
Wortes eingenommen würden, werden durch Leerzeichen ersetzt.
Durch die MEHR-Anweisung mit einem Parameter kann die Zahl
der Zeilenwiederholungen für die nächste Musterzeile festgesetzt
werden. Dies hat jedoch nur eine Auswirkung, falls Zeilenwieder
holung zugelassen ist. Stehen zur Interpretation keine Restinhalte
mehr zur Verfügung, wird mit leeren Inhalten weitergearbeitet. Kann
ein Inhalt bei der vorgegebenen Anzahl von Zeilen nicht ganz dar
gestellt werden, wird der Rest nicht ausgegeben.
#abschnitt ("5.4", "ANSCHLUSS ZUM ELAN-COMPILER", "Anschluß zum ELAN-Compiler")#
Falls in einem Druckmuster Abkürzungen, Kommandozeilen oder
Gruppendefinitionen vorkommen, wird das Druckmuster in ein
ELAN-Programm umgewandelt, das dann vom ELAN-Compiler über
setzt wird.
Alle Zeilen eines Abkürzungsteils werden direkt in das Pro
gramm übernommen, wobei der Name einer Abkürzung durch einen
beliebig gewählten Refinementnamen ersetzt wird ('abk' + eine lau
fende Nummer). Alle Abkürzungen und Refinements werden als glo
bale Refinements definiert, also außerhalb von Prozeduren. Dadurch
wird erreicht, daß sie an jeder Stelle verwendet werden können.
Damit eine Abkürzung richtig als Refinement übersetzt wird,
muß sie ein TEXT-Objekt als Wert liefern. Die anderen Refinements
sind beliebig, da sie nur in selbstdefinierten Anweisungen verwen
det werden. Die Refinements der Abkürzungen werden in einer Zu
weisung an eine TEXT-Variable verwendet, damit der Druckgenera
tor auf den entsprechenden Wert zugreifen kann.
Jeder Abschnitt wird dagegen als eine Prozedur übersetzt. Eine
Folge von Musterzeilen wird in eine Anweisung übersetzt, diese
Musterzeilen einzusetzen und zu drucken. Eine '%%'-Anweisung wird
einfach unverändert dazwischengeschrieben. Die Prozedur für den
Wiederholungsteil wird einmal für jeden ausgewählten Satz aufgeru
fen, die Vorspann- und die Nachspann-Prozedur einmal bei jedem
Gruppenwechsel.
Anweisungen im Initialisierungsteil werden an den Anfang des
Programms als globale Definitionen gestellt.
#a ("Fehler")# Findet sich in dem erzeugten ELAN-Programm ein Fehler,
der durch den Druckgenerator nicht erkannt werden konnte (z.B.
eine Abkürzung liefert keinen Wert), so muß der ELAN-Compiler
diesen Fehler erkennen. Anschließend zeigt er das erzeugte Pro
gramm zusammen mit seinen Fehlermeldungen im Paralleleditor. Sie
müssen nun die Fehlermeldung lokalisieren und anhand der eben
gegebenen Hinweise in das ursprüngliche Druckmuster zurücküber
setzen, damit Sie dort den Fehler korrigieren können.
#abschnitt ("5.5", "FEHLERMELDUNGEN", "Fehlermeldungen")#
Folgende Fehlermeldungen können bei der Übersetzung eines Druck
musters auftreten:
#on("i")#keine schliessende Klammer in Feldmuster#off("i")#
Wenn der Name in einem Feldmuster in spitze Klammern einge
schlossen werden soll, muß noch in der gleichen Zeile eine
schließende Klammer vorhanden sein.
#on("i")#kein Kommando in Kommandozeile#off("i")#
Eine Zeile, die mit '%' beginnt, enthält keinen weiteren Text.
#on("i")#unbekanntes Kommando#off("i")#
Das erste Wort in einer Kommandozeile ist kein bekanntes Kom
mando.
#on("i")#kein % WIEDERHOLUNG gefunden#off("i")#
Das Druckmuster enthält keine Anweisung, die den Beginn eines
Abschnittes markiert. Es muß aber mindestens ein Abschnitt
vorhanden sein.
#on("i")#nur GRUPPE-Anweisung erlaubt#off("i")#
Im Initialisierungsteil ist nur die GRUPPE-Anweisung erlaubt.
#on("i")#keine ELAN-Anweisung im Initialisierungsteil nach Gruppen
definition#off("i")#
Sobald im Initialisierungsteil eine GRUPPE-Anweisung aufgetreten
ist, ist keine Kommandozeile mehr möglich.
#on("i")#illegale Gruppennummer#off("i")#
In einer GRUPPE-Anweisung wurde eine zu große Nummer angege
ben. Gruppen sollten von 1 an durchnumeriert werden.
#on("i")#diese Gruppe wurde schon definiert#off("i")#
Eine Gruppennummer wurde mehrfach verwendet.
#on("i")#diese Abkürzung ist nicht definiert#off("i")#
Ein Name in einem Feldmuster tritt nicht als Feld-oder Abkür
zungsname auf. Eventuell enthält er ein Leerzeichen!
#on("i")#dieser Abschnitt wurde schon einmal definiert#off("i")#
Kein Abschnitt kann mehrmals angegeben werden.
#on("i")#falscher Modus#off("i")#
In einer MODUS-Anweisung wurde ein nicht definierter Modus als
Parameter angegeben.
#on("i")#diese Anweisung darf im Musterteil nicht vorkommen#off("i")#
#on("i")#im Abkürzungsteil darf keine Anweisung auftreten#off("i")#
#on("i")#in dieser Zeile stehen zu viele Feldmuster#off("i")#
Es können maximal 24 Feldmuster in einer Zeile stehen. Abhilfe:
mehrere Feldmuster durch eine Abkürzung zusammenfassen.
#on("i")#das Druckmuster enthält zu viele Feldmuster#off("i")#
Die Gesamtanzahl der Feldmuster ist begrenzt. Abhilfe: mehrere
Feldmuster durch eine Abkürzung zusammenfassen.
#on("i")#nach dem "&" soll direkt der Name einer Abkürzung folgen#off("i")#
In einer Abkürzungszeile stehen Leerzeichen hinter dem '&'.
#on("i")#kein Doppelpunkt nach Abkürzung#off("i")#
Nach dem Abkürzungsnamen in einer Abkürzungszeile muß durch
ein Leerzeichen getrennt ein Doppelpunkt folgen.
#on("i")#Abkürzung mehrfach definiert#off("i")#
Die Abkürzung wurde unter dem gleichen Namen schon einmal,
vielleicht in einem anderen Abschnitt, definiert.
#on("i")#das Druckmuster enthält zu viele Abkürzungen#off("i")#
Abhilfe: mehrere Abkürzungen zu einem Ausdruck zusammenfas
sen.
|