next up previous contents index
Next: Datenräume Up: L3 Referenzhandbuch Previous: Einfache Datentypen

Textdateien

Einführung

Textdateien sind Datenräume, deren innere Struktur als Folge von Sätzen aufgefaßt wird. Beispielsweise können das die einzelnen Zeilen eines Textdokuments, das am Bildschirm angezeigt werden kann, sein. Der Zugriff auf solche Objekte erfolgt durch Assoziierung eines solchen Datenobjekts mit dem Datentyp FILE.

Ein FILE ist ein Datenobjekt des Typs sequentielle Datei. Eine solche Datei besteht aus einer Folge von records (Sätzen oder Zeilen). Die Assoziierungsprozedur sequential file hat die Aufgabe, eine in einem Programm deklarierte FILE VAR mit einem bereits vorhandenen oder noch einzurichtenden Datenraum, der die geforderte innere Struktur »Reihe von Sätzen« hat, zu koppeln. Bei der Koppelung muß angegeben werden, in welcher Weise auf die Datei zugegriffen werden soll.

Der erste Parameter der Prozedur sequential file gibt stets die »Betriebsrichtung« (TRANSPUTDIRECTION) der folgenden Operationen an. Es gibt deren drei:

input
Die Datei kann vom Programm nur sequentiell gelesen werden. Durch input wird bei der Assoziierung automatisch auf den ersten Satz der Datei positioniert. Ist die zu lesende Datei nicht vorhanden, wird ein Fehler gemeldet.

output
Die Datei kann vom Programm nur sequentiell beschrieben werden. Durch output wird bei der Assoziierung automatisch hinter den letzten Satz der Datei positioniert (bei einer leeren Datei also auf den ersten Satz). Ist die Datei vor der Assoziierung nicht vorhanden, wird sie automatisch eingerichtet.

modify
Die Datei kann vom Programm in beliebiger Weise gelesen und beschrieben werden. Im Gegensatz zu den Betriebsrichtungen input und output, bei denen ausschließlich ein rein sequentielles Lesen oder Schreiben erlaubt ist, kann bei modify beliebig positioniert, gelöscht, eingefügt und neu geschrieben werden. Bei Assoziierung mit modify ist bei einer existierenden Datei die Position zunächst undefiniert. Eine Positionierung muß explizit vorgenommen werden. Die Datei wird automatisch eingerichtet, wenn sie vor der Assoziierung nicht vorhanden war.

Der zweite Parameter der Assoziierungsprozedur sequential file gibt an, unter welchem Namen die Datei in der Task existiert oder eingerichtet werden soll.

Beispiel:
FILE VAR meine datei :: sequential file (output, "xyz");
Folgendes Beispiel zeigt ein Programm, welches eine Datei liest und auf dem Ausgabemedium ausgibt:

Beispiel:
FILE VAR f :: sequential file (input, "datei1"); 
TEXT VAR satz; 
WHILE NOT eof (f) REP 
   getline (f, satz); 
   putline (satz); 
END REP.
Das Festlegen einer Betriebsrichtung impliziert eine Kontrolle der Benutzung der betreffenden Datei und hilft somit Programmierfehler zu vermeiden.

ACHTUNG: Alle Prozeduren, die auf FILEs zugreifen, verlangen Objekte vom Typ FILE VAR, da auch die Leseoperationen als ändernd betrachtet werden.

Operationen auf Textdateien

tabular2903

Assoziierung

sequential file

FILE PROC sequential file(TRANSPUTDIRECTION CONST mode, DATASPACE CONST ds)

Wirkung: Assoziierung einer sequentiellen Datei mit dem Dataspace 'ds' und der Betriebsrichtung 'mode' (vergl. modify, input bzw. output). Diese Prozedur dient zur Assoziierung eines temporären Datenraums in der Benutzer-Task, auf den nach der Beendigung des Programmlaufs nicht mehr zugegriffen werden kann.
Bemerkung: Da der Name des Datenraums nach Beendigung des Programmlaufs nicht mehr ansprechbar ist, muß der Datenraum explizit vom Programm gelöscht werden, da sonst eine »Datenraumleiche« entsteht!

FILE PROC sequential file(TRANSPUTDIRECTION CONST mode, TEXT CONST name)

Wirkung: Assoziierung einer sequentiellen Datei mit dem Namen 'name' und der Betriebsrichtung 'mode'. Existiert der FILE bereits, dann wird mit input auf den Anfang des FILEs, bei output hinter den letzten Satz der Datei positioniert. Existiert dagagen der FILE noch nicht und ist die TRANSPUTDIRECTION output oder modify, wird ein neuer FILE eingerichtet.
Fehler: "name" gibt es nicht Es wurde versucht, einen nicht vorhandenen FILE mit input zu assoziieren.

input

PROC input (FILE VAR file)

Wirkung: Ändern der Verarbeitungsart von modify oder output in input. Dabei wird auf den ersten Satz der Datei positioniert.

TRANSPUTDIRECTION CONST input

Wirkung: Assoziierung - in Zusammenhang mit der Prozedur sequential file -einer sequentiellen Datei mit der TRANSPUTDIRECTION input (nur lesen).

output

PROC output (FILE VAR file)

Wirkung: Ändern der Verarbeitungsart von input oder modify in output. Dabei wird hinter den letzten Satz der Datei positioniert.

TRANSPUTDIRECTION CONST output

Wirkung: In Verbindung mit der Prozedur sequential file kann eine Datei assoziiert werden mit der Betriebsrichtung output (nur schreiben).

modify

PROC modify (FILE VAR file)

Wirkung: Ändern der Betriebsrichtung von input oder output in die Betriebsrichtung modify.

TRANSPUTDIRECTION CONST modify

Wirkung: Diese Betriebsrichtung erlaubt das Vorwärts- und Rückwärts- Positionieren und das beliebige Einfügen und Löschen von Sätzen.

Informationsprozeduren

eof

BOOL PROC eof (FILE CONST file)

Wirkung: Informationsprozedur auf das Ende eines FILEs. Liefert den Wert TRUE, sofern hinter den letzten Satz eines FILEs positioniert wurde, sonst FALSE.

line no

INT PROC line no (FILE CONST file)

Wirkung: Liefert die aktuelle Zeilennummer.

lines

PROC lines (FILE VAR file)

Wirkung: Liefert die Anzahl der Zeilen der Datei 'file'.

Betriebsrichtung INPUT

In der Betriebsrichtung input sind nur Leseoperationen auf der Datei zugelassen. Die Assoziierungsprozedur sequential file bewirkt folgendes:

Mit »Wort« ist im folgenden eine nicht leere Zeichenkette aus Zeichen, die ungleich dem Leerzeichen sind, gemeint.

get

PROC get (FILE VAR file, INT VAR number)

Wirkung: Lesen des nächsten Wortes aus der Datei 'file' und Konvertierung des Wortes zu einem Integer-Objekt.

PROC get (FILE VAR file, REAL VAR number)

Wirkung: Lesen des nächsten Wortes aus der Datei 'file' und Konvertierung des Wortes zu einem Real-Objekt.

PROC get (FILE VAR file, TEXT VAR text)

Wirkung: Lesen des nächsten Wortes aus der Datei 'file'.

PROC get (FILE VAR file, TEXT VAR text, TEXT CONST delimiter)

Wirkung: Lesen eines TEXT-Wertes 'text' von der Datei 'file', bis das Zeichen 'delimiter' angetroffen wird. Ein eventueller Zeilenwechsel in der Datei wird dabei übergangen.

PROC get (FILE VAR file, TEXT VAR text, INT CONST maxlength)

Wirkung: Lesen eines TEXT-Wertes 'text' von der Datei 'file' mit 'maxlength' Zeichen. Ein eventueller Zeilenwechsel in der Datei wird dabei nicht übergangen.

getline

PROC get line (FILE VAR file, TEXT VAR record)

Wirkung: Lesen der nächsten Zeile aus der sequentiellen Datei 'file'.
Fehler: "Datei zu!" Die Datei 'file' ist gegenwärtig nicht assoziiert.

"Leseversuch nach Dateiende" Es wurde versucht, über die letzte Zeile einer Datei hinaus zu lesen.

"Leseversuch auf output file" Es wurde versucht, von einem mit output assoziierten FILE zu lesen.

"Unzulässiger Zugriff auf modify-FILE" Es wurde versucht, aus einer mit modify assoziierten Datei zu lesen. Bei getline muß die Datei mit input assoziiert sein.

Betriebsrichtung MODIFY

In der Betriebsrichtung modify sind Lese- und Schreiboperationen auf der Datei zugelassen. Desweiteren ist beliebiges Positionieren in der Datei erlaubt. Neue Sätze können an beliebiger Stelle in die Datei eingefügt werden, die sequentielle Struktur der Datei bleibt erhalten. Die Assoziierungsprozedur sequential file bewirkt folgendes:

col

PROC col (FILE VAR file, INT CONST position)

Wirkung: Positionierung auf die Spalte 'position' innerhalb der aktuellen Zeile.

INT PROC col (FILE CONST file)

Wirkung: Liefert die aktuelle Position innerhalb der aktuellen Zeile.

down

PROC down (FILE VAR file)

Wirkung: Positionieren um eine Zeile vorwärts.

PROC down (FILE VAR file, INT CONST lines)

Wirkung: Positionieren um 'lines' Zeilen vorwärts.

to line

PROC to line (FILE VAR file, INT CONST number)

Wirkung: Positionierung auf die Zeile 'number'.

to eof

PROC to eof (FILE VAR file)

Wirkung: Positionierung auf die letzte Zeile der Datei.

up

PROC up (FILE VAR file)

Wirkung: Positionieren um eine Zeile rückwärts.

PROC up (FILE VAR file, INT CONST number)

Wirkung: Positionieren um 'number' Zeilen rückwärts.

delete record

PROC delete record (FILE VAR file)

Wirkung: Der aktuelle Satz der Datei 'file' wird gelöscht. Der folgende Satz wird der aktuelle Satz.

insert record

PROC insert record (FILE VAR file)

Wirkung: Es wird ein leerer Satz in die Datei 'file' vor die aktuelle Position eingefügt. Dieser Satz kann anschließend mit write record beschrieben werden (d.h. der neue Satz ist jetzt der aktuelle Satz).

read record

PROC read record (FILE CONST file, TEXT VAR record)

Wirkung: Liest den aktuellen Satz der Datei 'file' in die TEXT-Variable 'record'. Die Position wird dabei nicht verändert.

write record

PROC write record (FILE VAR file, TEXT CONST record)

Wirkung: Schreibt einen Satz in die Datei 'file' an die aktuelle Position. Dieser Satz muß bereits vorhanden sein, d.h. mit write record kann keine leere Datei beschrieben werden, sondern es wird der Satz an der aktuellen Position überschrieben. Die Position in der Datei wird nicht verändert.

Betriebsrichtung OUTPUT

In der Betriebsrichtung output sind nur Schreiboperationen auf der Datei zugelassen. Die Assoziierungsprozedur sequential file bewirkt folgendes:

line

PROC line (FILE VAR file)

Wirkung: Positionierung auf die nächste Zeile der Datei 'file'.

PROC line (FILE VAR file, INT CONST lines)

Wirkung: Positionierung mit 'lines' Zeilen Vorschub in der Datei 'file'.
Fehler: "Datei zu!" Die Datei 'file' ist gegenwärtig nicht assoziiert.

"Schreibversuch auf input-File" Es wurde versucht, auf einen mit 'input' assoziierten FILE zu schreiben.

put

PROC put (FILE VAR file, INT CONST number)

Wirkung: Ausgabe eines INT-Wertes 'number' in die Datei 'file'. Dabei wird ein Leerzeichen an die Ausgabe angefügt.

PROC put (FILE VAR file, REAL CONST number)

Wirkung: Ausgabe eines REAL-Wertes 'number' in die Datei 'file'. Dabei wird ein Leerzeichen an die Ausgabe angefügt.

PROC put (FILE VAR file, TEXT CONST text)

Wirkung: Ausgabe eines TEXT-Wertes 'text' in die Datei 'file'. Dabei wird ein Leerzeichen an die Ausgabe angefügt.

Bemerkung: Bei Textdateien, die mit dem Editor weiterbearbeitet werden sollen, ist also zu beachten: eine Ausgabe mit 'put' setzt ein 'blank' hinter die Ausgabe. Falls dieses Leerzeichen das letzte Zeichen in der Zeile ist, wird eine Absatzmarke in der Zeile gesetzt. Wird mit write oder putline ausgegeben, steht kein Leerzeichen und somit keine Absatzmarke am Zeilenende.

putline

PROC putline (FILE VAR file, TEXT CONST record)

Wirkung: Ausgabe eines TEXTes 'record' in die Datei 'file'. Danach wird auf die nächste Zeile positioniert. 'file' muß mit 'output' assoziiert sein.

write

PROC write (FILE VAR file, TEXT CONST text)

Wirkung: Schreibt 'text' in die Datei 'file' (analog put (f, text)), aber ohne Trennblank.

Sortierung von Textdateien

Textdateien können zeilenweise sortiert werden. Die Sortierung kann nach ASCII oder lexikographisch erfolgen. Die ASCII Sortierung ordnet zeilenweise durch »text (zeile[i]) <= text (zeile[j])«. Insbesondere werden Kleinbuchstaben hinter Großbuchstaben geordnet.

Die lexikographischen Sortierung ordnet zeilenweise durch »text (zeile[i]) LEXGREATEREQUAL text (zeile[j])«, also nach Art des Telefonbuchs.

lexsort

PROC lexsort (TEXT CONST filename)

Wirkung: Die Datei 'filename' wird zeilenweise in lexikographischer Ordnung sortiert.

PROC lexsort (TEXT CONST filename, INT CONST firstpos)

Wirkung: Die Datei 'filename' wird zeilenweise in lexikographischer Ordnung, beginnend ab Spalte 'firstpos', sortiert.

sort

PROC sort (TEXT CONST filename)

Wirkung: Die Datei 'filename' wird zeilenweise in lexikographischer Ordnung sortiert.

PROC sort (TEXT CONST filename, INT CONST firstpos)

Wirkung: Die Datei 'filename' wird zeilenweise in lexikographischer Ordnung, beginnend ab Spalte 'firstpos', sortiert.

Editor

Der L3 Editor arbeitet auf Datenräumen des Typs FILE. Er bildet ein Eingabefenster auf einen Datenraum des Typs Textdatei. Der Editor stellt die üblichen Editorfunktionen bereit. Desweiteren verfügt der Editor über einen Kommandointerpreter. Dieser interpretiert Tastenfolgen der Art ESC key als Kommandos. Diese Tastenkombinationen und die Handhabung des Editors ist im L3 Benutzerhandbuch in Kapitel 14 beschrieben. Im weiteren sind »fortgeschrittene« Operatoren und Prozeduren erklärt. Sie können insbesonders dazu benutzt werden, Aktionen, die normalerweiser per Hand ausgeführt werden, auf Textdateien per Programm ablaufen zu lassen.

tabular3324

at

BOOL PROC at (TEXT CONST pattern)

Wirkung: Liefert TRUE, wenn ab der aktuellen Dateiposition 'pattern' steht.

CA

OP CA (TEXT CONST old, new)

Wirkung: Zwischen aktueller Dateiposition und Dateiende wird jedes Auftreten von 'old' durch 'new' ersetzt.

PROC change all (TEXT CONST old, new)

Wirkung: s.o.

C

OP C (TEXT CONST old, new)

Wirkung: Zwischen aktueller Dateiposition und Dateiende wird das erste Auftreten von 'old' durch 'new' ersetzt.

PROC change to (TEXT CONST old, new)

Wirkung: s.o.

col

INT PROC col (FILE CONST file)

Wirkung: Liefert die aktuelle Spaltenposition in 'file'.

INT PROC col

Wirkung: Liefert die aktuelle Spaltenposition in editfile.

D

OP D (INT CONST lines)

Wirkung: Positioniert in der gerade edierten Datei (editfile) 'lines' Zeilen weiter in Richtung Dateiende , ggf. in die letzte Zeile.

OP D (TEXT CONST pattern)

Wirkung: siehe down.

PROC down (INT CONST lines)

Wirkung: siehe D.

PROC down (TEXT CONST pattern)

PROC down (TEXT CONST pattern, INT CONST lines)

PROC down (FILE VAR file, TEXT CONST pattern)

PROC down (FILE VAR file, TEXT CONST pattern, INT CONST lines)

Wirkung: Positioniert auf das erste Auftreten von 'pattern' zwischen aktueller Position und Dateiende. Die Suche beginnt ein Zeichen hinter der aktuellen Position. Falls 'pattern' nicht gefunden wird, ist die aktuelle Position das Dateiende.

Die Suche kann durch Angabe von 'lines' auf die nächsten 'lines' Zeilen beschränkt werden.

PROC downety (TEXT CONST pattern)

PROC downety (TEXT CONST pattern, INT CONST lines)

PROC downety (FILE VAR file, TEXT CONST pattern)

PROC downety (FILE VAR file, TEXT CONST pattern, INT CONST lines)

Wirkung: Wie down, die Suche beginnt auf der aktuellen Position. Falls mehrfach nach dem gleichen 'pattern' gesucht wird, bleibt die Position unverändert.

edit

PROC edit

PROC edit (TEXT CONST pathname)

PROC edit (THESAURUS CONST thes)

PROC edit (FILE VAR file)

PROC edit (TEXT CONST pathname, INT CONST x, y, xsize, ysize)

PROC edit (FILE VAR file, INT CONST x, y, xsize, ysize)

Wirkung: Editoraufruf.
Parameter: 'pathname': Dateiname, wird falls nötig expandiert. 'file': assoziierte Datei. 'thes': do (PROC (TEXT CONST) edit, thes) 'x', 'y': linke, obere Ecke des Editorfenster auf dem Bildschirm. 'xsize', 'ysize': Fenstergröße.

editfile

FILE PROC editfile

Wirkung: Liefert einen FILE Wert um die aktuell edierte Datei zu assoziieren.
Beispiel: FILE VAR f := editfile; put (len(f));

G

OP G (TEXT CONST filename)

Wirkung: Vor der aktuellen Position wird die Datei 'filename' einkopiert. Ist in dieser Datei ein Bereich markiert, so wird nur dieser Bereich kopiert.

len

INT PROC len (FILE CONST file)

Wirkung: Liefert die Länge des aktuellen Satzes der Datei.

INT PROC len

Wirkung: Liefert die Länge des aktuellen Satzes von editfile.

limit

PROC limit (INT CONST new limit)

Wirkung: Stellt die maximal zulässige Zeilenlänge der aktuelle Datei auf 'new limit' Zeichen ein.

INT PROC limit

Wirkung: Liefert die eingestellte zulässige Zeilenlänge.

line no

INT PROC line no

Wirkung: Liefert die aktuelle Zeilennummer der edierten Datei.

lines

INT PROC lines

Wirkung: Zeilenzahl der aktuell edierten Datei.

mark

PROC mark (FILE VAR file, INT CONST line no, col)

Wirkung: In der Datei 'file' wird ein Ausschnitt markiert. Der Ausschnitt wird beschrieben durch den Start 'line no', 'col' und das Ende »aktuelle Position« (line no, col). Falls die Startposition der Markierung hinter dem Ende liegt, passiert nichts.

BOOL PROC mark (FILE CONST file)

Wirkung: Liefert TRUE, wenn in 'file' ein Abschnitt markiert ist.

mark col

INT PROC mark col (FILE CONST file)

Wirkung: Liefert die Spaltennummer des Markierungsanfangs in 'file'.

mark line no

INT PROC mark line no (FILE CONST file)

Wirkung: Liefert die Zeilennummer des Markierungsanfangs in 'file'.

margin

PROC margin (INT CONST col)

Wirkung: Stellt den linken Rand für die Darstellung der aktuellen Datei im aktuellen Editorfenster ein. Die Position des Editorfenster auf dem Bildschirm bleibt unverändert.

P

OP P (TEXT CONST filename)

Wirkung: Kopie des markierten Textes aus dem Editorfenster. Die Datei 'filename' wird sofort erzeugt. Falls 'filename' schon existiert, wird erfragt ob gelöscht werden soll. Falls 'filename' nicht gelöscht wird, wird der markierte Text aus der aktuell edierten Datei an 'filename' angehängt, sonst wird gelöscht und direkt neu erzeugt.

push

PROC push (TEXT CONST string)

Wirkung: Fügt die Zeichen 'string' in Editoreingabe ein.
Beispiel: push (""27"q")

quit

PROC quit

Wirkung: Das aktuelle Editorfenster wird geschlossen.

show

PROC show (TEXT CONST filename)

PROC show (FILE VAR file)

PROC show (THESAURUS CONST thes)

PROC show

Wirkung: Öffnet ein Editorfenster auf der (den) Datei(en). In diesem Fenster sind keine Schreibaktionen zulässig. Es ist aber möglich Text zu markieren und den markierten Text zu duplizieren (ESC d).

T

OP T (INT CONST line no)

PROC to line (INT CONST line no)

Wirkung: Positioniert auf Zeile 'line no' der aktuellen Datei ohne die Spaltenposition zu ändern. Falls die Datei weniger als 'line no' Zeilen hat, ist die aktuelle Position hinter dem letzten Zeichen der Datei.

U up uppety

Bemerkung: Wirkung und Parametrisierung sind analog zu D, down, downety. Die Suchrichtung ist jedoch von der aktuellen Position in Richtung Dateianfang.

wordwrap

PROC wordwrap (BOOL CONST bool)

Wirkung: Bei 'TRUE' wird der automatische Zeilenumbruch des Editors eingeschaltet, bei FALSE ausgeschaltet. Wenn das Kommando während des Edirens gegeben wird, wird die Einstellung als Dateiattribut gespeichert, wird die Einstellung im Monitor vorgenommen, so gilt sie als Voreinstellung für neue Dateien.

Notizbuch

Das Notizbuch ist ein unbenannte Datei, auf die ein zweites Editorfenster gesetzt werden kann, um z.B. Zwischenergebnisse oder besondere Meldungen anzuzeigen. Meldungen des ELAN Compilers etwa werden ins Notizbuch geschrieben.

anything noted

BOOL PROC anything noted

Wirkung: Liefert TRUE nachdem die erste Schreiboperation im Notizbuch vorgenommen wurde und FALSE nachdem das Notizbuch mit note edit angezeigt wurde.

note

PROC note (TEXT CONST text)

Wirkung: Schreibt 'text' ins Notizbuch.

PROC note (INT CONST number)

Wirkung: Schreibt text (number) + " " ins Notizbuch.

note edit

PROC note edit

Wirkung: Zeigt das Notizbuch an.

notefile

FILE PROC notefile

Wirkung: Liefert einen FILE Wert, um das Notizbuch zu assoziieren.

noteline

PROC noteline

Wirkung: Zeilenvorschub im Notizbuch.

Die Tastenverwaltung

In den Eingabeprozeduren edit und editget ist es möglich, Tastenkombinationen aus »ESC« und einer weiteren Taste zu definieren, die dann als Kommando oder Macro (Lernsequenz) interpretiert werden. Die Tasten werden also mit beliebigen Zeichenfolgen »belegt«. Auf diese Weise ist es möglich, häufig auftretende Eingaben auf Tasten zu legen.

Einige Tastenkombinationen sind in L3 vorbelegt, sie können jedoch tasklokal geändert werden. Falls in einer Task die Tastenbelegungen geändert waren, kann durch std keys die Normaleinstellung jederzeit wiederhergestellt werden.

Der Unterschied zwischen Macros und Kommandos besteht darin, daß ein Text, der als Macro auf eine Taste gelegt wurde, ausgegeben wird und dann weiter ediert werden kann. Natürlich kann ein Macro nicht nur druckbare Zeichen sondern auch Cursorpositionierungen etc. enthalten. Ein Kommando hingegen wird direkt an den ELAN Compiler übergeben.

Ein Taste kann entweder mit einem Macro oder einem Kommando belegt werden.

tabular3700

load key command

PROC load key command (TEXT CONST key, string)

Wirkung: Die Taste 'key' wird mit der Zeichenfolge 'string' belegt. Falls 'string' ein korrektes ELAN Programm darstellt, wird dieses Programm direkt übersetzt und ausgeführt, sobald ESC key hintereinander gedrückt werden. Falls das Programm nicht korrekt ist, erfolgt keine Reaktion. Es wird keine Fehlermeldung ausgegeben, um den Bildschirm nicht zu zerstören.

Beispiel: load key command ("l", "list")

load key macro

PROC load key macro (TEXT CONST key, string)

Wirkung: Die Taste 'key' wird mit der Zeichenfolge 'string' belegt. Sobald ESC key hintereinander gedrückt werden, wird die Zeichenfolge 'string' an der aktuellen Cursorposition ausgegeben.
Beispiel:
(* Editoraufruf auf Dateinamen aus 'list'    *) 
(* Alle Dateien werden angezeigt, der Cursor *) 
(* steht auf der Datei, die mit dem Makro    *) 
(* ediert werden soll.                       *) 
 
load key macro ("E", edit from list). 
edit from list : 
      esc + "p"          (* Zeile in Zwischenspeicher *) 
    + esc + "q"          (* 'list' verlassen *) 
    + esc + "g"          (* Zeile aus Zwischenspeicher holen *) 
    + ")" + hop + left 
    + "edit (" +  (13 * entf)+ return. (* Kommandozeile aufbauen *) 

        esc    : ""27"". (* Codes der benutzten Tasten *) 
        hop    : ""1"". 
        left   : ""8"". 
        entf   : ""12"". 
        return : ""13"".
key command

TEXT PROC key command (TEXT CONST key)

Wirkung: Liefert den Quelltext des auf die Taste 'key' gelegten ELAN Programms. Falls kein Kommando auf der Taste liegt, wird niltext geliefert.

key macro

TEXT PROC key macro (TEXT CONST key)

Wirkung: Liefert die Tastenfolge, die auf die Taste 'key' gelegt wurde. Falls keine Folge auf der Taste liegt, wird niltext geliefert.

key contains command

BOOL PROC key contains command (TEXT CONST key)

Wirkung: Liefert TRUE, wenn auf die Taste 'key' ein Kommando gelegt ist.

std keys

PROC std keys

Wirkung: Setzt die Belegung der systemseitig mit Macros voreingestellten Tasten auf die Standardbelegung zurück.

Scanner

Der Scanner kann benutzt werden, um festzustellen, welche Art von Symbolen in einem TEXT enthalten sind. Die Analyse des Textes folgt den Regeln von ELAN: die Repräsentation der Symbole muß der ELAN-Syntax entsprechen. Folgende Symbole werden vom Scanner erkannt:

tags:
Namen. Zeichenketten, die ausschließlich aus Kleinbuchstaben oder Ziffern bestehen. Leerzeichen innerhalb von Namen sind zulässig, werden jedoch überlesen.

bolds:
Schlüsselworte. Zeichenketten, die ausschließlich aus Großbuchstaben bestehen. Leerzeichen innerhalb von Schlüsselworten sind nicht zulässig.

number:
INT oder REAL Zahlen. Zeichenketten, die aus den Ziffern 0 bis 9 bestehen und ggf. ein Vorzeichen, einen Dezimalpunkt oder ein e enthalten (siehe REALs). Leerzeichen innerhalb von Zahlen sind zulässig, werden jedoch überlesen.

operator:
Alle Einzelzeichen, die nicht als Delimiter klassifiziert sind, sowie ::, :=, **, <=, >=.

delimiter:
Begrenzer. Gültige Delimiter sind ", (, ), [, ], ., , und ;. und das Ende des Scan-Textes.

Der Scanner überliest Kommentare und Leerzeichen zwischen den Symbolen. Der (erste) zu verarbeitende Text muß mit der Prozedur

scan

an den Scanner übergeben werden. Mit der Prozedur

next symbol

wird das jeweils nächste Symbol des TEXTes geholt. Am Ende wird end of scan und als Symbol niltext geliefert. Falls innerhalb eines TEXT-Denoters oder eines Kommentars end of scan auftritt, wird within text bzw. within comment gemeldet. Der Scan-Prozeß kann dann mit dem nächsten zu scannenden TEXT (der nächsten Zeile) fortgesetzt werden. Dafür wird nicht die Prozedur scan, sondern

continue scan

verwendet. Sie setzt im letzten Scan-Zustand (z.B. Kommentar oder TEXT-Denoter) wieder auf, so daß auch Folgen von TEXTen (Zeilen) - wie z.B. Dateien - leicht gescannt werden können.

Mit den Prozeduren

scan (* meldet eine Datei zum scannen an *)
next symbol (* holt die Symbole *)

kann man auch eine Datei nach ELAN-Symbolen untersuchen.

Scanner-Prozeduren

continue scan

PROC continue scan (TEXT CONST string)

Wirkung: Das Scanning soll mit 'string' fortgesetzt werden. Falls der Scan- Vorgang beim vorigen 'string' innerhalb eines TEXT-Denoters oder eines Kommentars abgebrochen wurde, wird er jetzt entsprechend mit dem nächsten next symbol fortgesetzt. Der erste Teil-Scan einer Folge muß aber stets mit scan eingeleitet werden!

next symbol

PROC next symbol (TEXT VAR symbol, INT VAR type)

Wirkung: Holt das nächste Symbol. In 'symbol' steht der TEXT des Symbols, so z.B. die Ziffern eines INT-Denoters. Bei TEXT-Denotern werden die führenden und abschließenden Anführungsstriche

die führenden und abschließenden Anführungsstriche abgeschnitten. Leerzeichen oder Kommentare spielen in tags und numbers keine Rolle. Zwischen Symbolen spielen Leerzeichen und Kommentare keine Rolle. Der Type des Symbols wird in der Variablen 'type' - wie unter Parameter beschrieben - geliefert.

Bemerkung: Wird Scan-Ende innerhalb eines Kommentars gefunden, so wird niltext und within comment geliefert. Wird Scan-Ende innerhalb eines TEXT-Denoters gefunden, so wird der schon analysierte Teil des Denoters und within text geliefert.

Parameter: In 'type' steht eine Kennzeichung für den Typ des Symbols.

 
tag             = 1 , 
bold            = 2 , 
number          = 3 , 
text            = 4 , 
operator        = 5 , 
delimiter       = 6 , 
end of file     = 7 , 
within comment  = 8 , 
within text     = 9 .

PROC next symbol (TEXT VAR symbol)

Wirkung: Wie oben. Es wird aber nur der Text des Symbols (ohne Typ) geliefert.

PROC next symbol (FILE VAR file, TEXT VAR symbol, INT VAR type)

Wirkung: Wie oben. Jedoch wird auf einem FILE gearbeitet.

PROC next symbol (FILE VAR file, TEXT VAR symbol)

Wirkung: Wie oben. Jedoch wird auf einem FILE gearbeitet.

scan

PROC scan (TEXT CONST string)

Wirkung: Meldet einen 'string' für den Scanner zur Verarbeitung an. Die Prozedur scan muß vor dem ersten Aufruf von next symbol gegeben werden. Im Gegensatz zu continue scan normiert scan den inneren Zustand des Scanners, d.h. vorherige Scan-Vorgänge haben keinen Einfluß mehr auf das Scanning.

PROC scan (FILE VAR file)

Wirkung: Wie oben. Jedoch wird auf einen FILE gearbeitet. Die zu untersuchende Zeile ist die nächste Zeile im FILE 'f' (scan macht zuerst ein getline).

Beispiel:
FILE VAR file := sequential file (input, filename); 
 
TEXT VAR symbol := "", 
         bedeutung := ""; 
INT VAR type; 
 
scan (file); 
WHILE NOT eof (file) 
REP 
   next symbol (file, symbol, type); 
   analyse ; 
   IF type = 8 COR type = 9 
      THEN continue scan (symbol) FI; 
PER 
 
.analyse: 
   put(symbol) ; line ; 
   put("Typ: ");put(type); 
SELECT type OF 
   CASE 1 :  bedeutung := "tag" 
   CASE 2 :  bedeutung := "bold" 
   CASE 3 :  bedeutung := "number" 
   CASE 4 :  bedeutung := "text" 
   CASE 5 :  bedeutung := "operator" 
   CASE 6 :  bedeutung := "delimiter" 
   CASE 7 :  bedeutung := "End of File" 
   CASE 8 :  bedeutung := "within comment" 
   CASE 9 :  bedeutung := "within text" 
 
OTHERWISE 
errorstop("Unmöglicher Wert vom Scanner"); 
END SELECT; 
 
put (bedeutung); 
line; 
pause(10).


next up previous contents index
Next: Datenräume Up: L3 Referenzhandbuch Previous: Einfache Datentypen

Michael Hohmuth
Sun Mar 31 04:49:53 MET DST 1996