Home
Up
Intro
Contents
Chapter
1
2
3
4
5
6
7
8
9
10
Design
Assert
Timing
EBNF
Report
Pas
Last Changed: Nov. 19, 1997
This is a conversion from Oberon text to HTML. The converter software is still under development,
and some features or information may be missing in this converted version.
HTML hypertext facilities are not yet active in this document.
To exploit the interactive facilities, use Oberon System 3 and the source of this text,
available as ASCII-coded Oberon System 3 documents. A previous version is also available for Oberon V4.
To access this and other additional material use
ftp.
For the convenience of our students, most of this information and the related material is in German.
Sorry if this is not one of your languages.
Einführung in die Programmiersprache Oberon.
03: Syntax und Semantik
Alle Komponenten von Oberon sind erlaubte Quellen für Kommandos.
Es spielt keine Rolle, wo das Kommando eingegeben wird. Dies gibt beträchtliche
Flexibilität, aber es ist auch eine denkbare Fehlerquelle. Anstelle
eines Kommandos kann versehentlich irgend ein Text aktiviert werden. Oberon
muss in der Lage sein, zumindest grobe Fehler und Probleme abzufangen. Was
passiert, wenn Sie sich vertan haben und eine falsche Zeile/eine falsche
Textstelle aktivieren ? Probieren Sie's ! Oberon kann gültige
von ungültigen Kommandos auf zwei Arten unterscheiden.
1. Syntaktische Analyse.
Es gibt eine eindeutig festgelegte Syntax, der alle Kommandos folgen. Wenn
eine Eingabe nicht dieser Syntax folgt, dann kann sie kein Kommando sein.
2. Semantische Analyse.
Wenn eine Eingabe syntaktisch akzeptabel ist, so legt die Syntax für
die einzelnen Bestandteile bestimmte Rollen nahe. In einem zweiten Schritt
kann Oberon prüfen, ob die Bestandteile eine Interpretation haben,
die dieser Rolle gerecht werden kann. Um dies zu klären versucht Oberon,
die Eingabe semantisch zu analysieren, das heisst die Bedeutung zu identifizieren.
Bei den meisten Teilen des obigen Text-Auszugs reicht die Syntax um zu entscheiden,
dass dies keine Eingabe sein kann - Oberon kann sie als Kommandos ignorieren.
Wenn Sie jedoch etwa auf das letzte Wort "identifizieren." gezeigt haben,
so erhalten Sie im "System.Log" eine Meldung "not found". "identifizieren."
ist als Eingabe syntaktisch zulässig. Erst die semantische Analyse
zeigt Oberon, dass für "identifizieren." keine Bedeutung gefunden werden
kann.
Aufgabe einer Programmiersprache ist es, syntaktische und semantische Regeln
festzulegen, die eine eindeutige und effiziente Bearbeitung von Kommandos
ermöglichen. Programmiersprachen sollen aber über die Verarbeitung
vordefinierter Kommandos hinausgehen: wir wollen neue Kommandos definieren
und Information zwischen verschiedenen Bearbeitungsschritten weiterreichen
können. Konsistenz und Effizienz sind dabei oft gegenläufige
Forderungen, die verschiedene Phasen der Bearbeitung betreffen: Die Analyse
einer Eingabe und die konsistente Interpretation erfordert Zeit. Ist Verarbeitungsgeschwindigkeit
massgeblich, so geht dies oft zu Lasten der Effizienz oder der Verlässlichkeit.
Der Weg bei Oberon ist es, wie bei den meisten Systemen, bei Erweiterungen
des Kommandovorrats die Analyse von der Ausführung zu trennen. In einem
ersten Schritt wird die Beschreibung der Kommandoerweiterung, die Programmquelle,
analysiert. Bei Inkonsistenzen oder unvollständigen Definitionen erfolgt
eine Fehlermeldung und die weitere Bearbeitung wird abgebrochen. Bei konsistenter
und hinreichend vollständiger Definition wird die Programmquelle von
ihrer für den Menschen lesbaren Form in eine für die maschinelle
Abarbeitung effizientere Form, das Programm-Objekt, umgewandelt. Dieser Prozess
heisst Übersetzung (compiling). Die Programm-Quelle folgt dabei den
Regeln der Oberon-Sprache; das übersetzte Programm wird dann vom Oberon-System
genutzt. Bei Oberon, wie bei den meisten Programmiersprachen, muss die Übersetzung
explizit angefordert werden. Nach der Übersetzung stehen die neuen
Kommandos im Oberon-System für die Ausführung sofort zur Verfügung.
Die syntaktischen und semantischen Regeln der Sprache Oberon sind strenger
als die einfachen Regeln, nach denen Kommandos identifiziert werden. Der
grösste Teil des Kurses wird sich mit der Programmiersprache Oberon
befassen. In diesem Kapitel beginnen wir mit den einfacheren Regeln der Kommando-Interpretation.
Ein Kommando ist die elementare Ausführungseinheit
für das Oberon-System. Kommandos sind gebündelt in Modulen. Datenhaltung
und konsistente Datenübergabe wird jeweils per Modul definiert. Ein
Modul kann ausser extern zugänglichen Kommandos
auch interne Prozeduren enthalten oder weitere extern
zugängliche Prozeduren enthalten. Sichtbarkeit und Zugriffsbedingungen
für Daten und Prozeduren festzulegen und zu überwachen sind Aufgaben
der Module.
Ein Kommando rufen Sie auf, wenn Sie auf den Kommando-Name zeigen und "Aktivieren"
drücken. So ist zum Beispiel
System.Time
ein Kommando, mit dem die Zeit im System.Log notiert wird. Hingegen ist
Dies ist kein Kommando
ohne Wirkung, während
Fehler.
zu einer Fehlermeldung führt. Oberon kann diese Zeile durch eine syntaktische
Analyse unterscheiden. Ein Oberon-Kommando hat immer die Syntax
Modul-Name.Prozedur-Name
An diesem Beispiel wollen wir etwas genauer sein. Wir führen hier Konventionen
und Darstellungsweisen ein, denen wir im weiteren folgen wollen. Wir benutzen
hier eine typographische Konvention:
Stellvertreter werden wie abc dargestellt.
Für sie werden nach Bedarf entsprechende Werte eingesetzt. Feste Eingaben
haben das Aussehen abc. Sie müssen
genau wie in der angegebenen Form geschrieben werden.
Modul-Name und Prozedur-Name sind syntaktisch gleichwertig. Beide haben einen
gemeinsamen syntaktischen Typ, den wir Oberon-Name nennen.
Modul-Name: Oberon-Name
Prozedur-Name: Oberon-Name
Anstelle der gemeinsamen Bezeichnung Oberon-Name benutzen wir auskunftsfähige
Namen, um die Intention einer syntaktischen Konstruktion deutlicher zu machen.
Wir müssen für diese Verdeutlichung bezahlen: in einer zweiten
Überlegung müssen wir unterscheiden, was syntaktische Definition
ist, und was semantischer Hinweis.
Wir benutzen Ketten von Definitionen. Zur Definition dürfen nur Bestandteile
benutzt werden, die eindeutig definiert sind. Oberon-Name ist noch
nicht definiert. Was ist ein gültiger Name in Oberon ? Ist "Oberon"
ein gültiger Name ? "Kommando für Oberon" ? "Pi" ? "3.14159"
? "a_b_c" ? "Jürgen" ? Sind griechische Namen (mit griechischen Zeichen)
erlaubt ? Chinesische ? Es ist wichtig, strikte Regeln für Namen einzuführen.
Dadurch können versehentliche Eingaben frühzeitig verlässlich
identifiziert werden. Andererseits müssen alle Eingaben auf diese Regeln
überprüft werden. Diese Überprüfung findet also an
einer zentralen Stelle statt. Deshalb müssen die Regeln schnell überprüfbar,
also einfach sein.
Hier ist der Oberon-Kompromiss: erlaubte Zeichen sind zunächst die
Zeichen des US-ASCII-Codes. Buchstaben (im Sinne von Oberon) sind nur die
Buchstaben in diesem Code, das heisst A-Z, a-z.
Buchstabe: A-Z, a-z
Ziffer: 0-9
Erlaubte Namen sind alle Folgen von Buchstaben oder Ziffern, die mit einem
Buchstaben beginnen. Um dies formal zu notieren benutzen wir eine Notation,
die auf Backus und Naur zurückgeht.
xxx | yyy bedeutet xxx
oder yyy
{ zzz } bedeutet keine,
eine oder mehrere
Wiederholungen
von zzz
[ www ] bedeutet einen
möglichen, aber nicht
notwendigen
Eintrag www.
Mit dieser Notation ist
Oberon-Name: Buchstabe
{ Ziffer | Buchstabe }
Welche der folgenden Zeichenketten sind erlaubte Oberon-Namen:
a) Oberon b)
Kommando für Oberon c) Pi
d) 3.14159 e)
a_b_c f) Jürgen
g) Catch22 h)
"Hallo"
Zusammengenommen bestimmen die folgenden Definitionen, was ein syntaktisch
zulässiger Kommando-Name ist:
Buchstabe: A-Z,
a-z
Ziffer: 0-9
Oberon-Name: Buchstabe
{ Ziffer | Buchstabe }
Modul-Name: Oberon-Name
Prozedur-Name: Oberon-Name
Kommando-Name: Modul-Name.Prozedur-Name
Durch diese Syntax-Definition sind beliebig lange Kommando-Namen und Prozedur-Namen
erlaubt. Auch hier muss zwischen Effektivität und Flexibilität
abgewogen werden. Jedes konkrete Oberon-System setzt hier praktische Grenzen
durch Implementierungs- Einschränkungen.
Ein Kommando kann nur ausgeführt werden, wenn es in syntaktisch zulässiger
Weise aufgerufen wird. Damit es ausgeführt werden kann, muss es eine
auswertbare Semantik haben. Der Modul-Name muss ein Modul bezeichnen, auf
den Oberon zugreifen kann. Dieses Modul muss eine Prozedur mit der Bezeichnung
Prozedur-Name zur Ausführung bereitstellen.
Wird ein Textausschnitt aktiviert, so führt Oberon eine syntaktische
Analyse durch. Verwirft diese Analyse den Textausschnitt, so wird die Eingabe
ignoriert. Ist die Eingabe syntaktisch zulässig, so versucht Oberon
das entsprechenden Modul zu finden. Wird das Modul nicht gefunden, so durchsucht
Oberon die für Oberon zugänglichen Dateien. Findet Oberon darin
das entsprechende Modul, so wird es geladen. Andernfalls erfolgt eine Fehlermeldung,
z.B. für das Kommando xxx.zzz die Meldung
Call error: xxx not found
Konnte das Modul gefunden oder erfolgreich geladen werden, so sucht Oberon
in diesem Modul die gewünschte Funktion. Wird sie nicht gefunden, so
erfolgt eine Fehlermeldung
Call error: zzz not found
Nicht jeder "sinnvolle" Name ist ein Name im Sinne der Oberon-Definition.
Damit auch nicht-Oberon-Namen behandelt werden können, gibt es das
Sprach-Konstrukt der Strings: ein String ist eine Zeichenkette (von darstellbaren
Zeichen), die durch ' oder " abgegrenzt ist, und die diesen Delimiter nicht
enthält. Damit ist es möglich, zum Beispiel Konstrukte wie
"http://statlab.uni-heidelberg.de"
zu benutzen, ohne mit den Oberon-Konventionen in Konflikt zu geraten. Verschiedene
Oberon-Implementierungen machen weitergehende Zugeständnisse, um ein
bequemeres Arbeiten zu ermöglichen. So erlauben zum Beispiel die Oberon
S3-Implementierung für Macintosh und Windows und die meisten UNIX-Implementierungen
Dateinamen wie
Kurs/Oberon2.EBNF
Die genauen Konventionen für Dateinamen hängen vom Umgebungssystem
und der benutzten Oberon-Variante ab. Bitte informieren Sie sich in den Unterlagen
zu Ihrem Oberon-System.
Die vollständige Syntax von Oberon füllt weniger als eine Seite.
Sie erhalten diese Tabelle, wenn Sie
Desktops.OpenDoc Kurs/Oberon2.EBNF
aktivieren. Dies ist ein Auszug aus dem Oberon-Report, der Syntax und Semantik
von Oberon definiert. Der Oberon-Report ist die grundlegende Definition der
Sprache Oberon. Den Oberon-Report erhalten Sie mit
Desktops.OpenDoc Kurs/Oberon2.Report.Text
Einführung in die Programmiersprache Oberon. Kurs/Kap03.Text
gs (c) G. Sawitzki, StatLab Heidelberg
<http://statlab.uni-heidelberg.de/projects/oberon/kurs/>
Home
Up
Intro
Contents
Chapter
1
2
3
4
5
6
7
8
9
10
Design
Assert
Timing
EBNF
Report
Pas