4. Minisprache

4.1 Konzeption der Minisprache

Die Minisprache ist von der Syntax her den späteren Wirth-Sprachen (Modula-2, Oberon) nachempfunden. Insbesondere sind alle Strukturen selbstklammernd, Variablen werden vor Beginn des Algorithmus vereinbart. Die typischen Algorithmuselemente sind vorhanden: Ein- und zweiseitige bedingte Anweisung, Wiederholung mit Ein- bzw. Ausgangsbedingung sowie Zählwiederholung.

Aufgrund der einfachen Zielmaschine sind natürlich Einschränkungen notwendig. Es gibt keine Unterprogramme, da diese von der Minimaschine nicht unterstützt werden. Aus dem gleichen Grund gibt es auch keine Unterstützung für Kommazahlen. Da auch auf die Einführung logischer Werte verzichtet wird, beschränken sich die Variablen auf ganze Zahlen, sodass kein Typenkonzept eingeführt werden musste.

Ergebnisse von Algorithmen müssen wie bei der Assemblerprogrammierung im Speicher abgelegt werden. Die Vorbesetzung von Variablen erfolgt direkt zu Beginn eines Programms.

4.2 Programmaufbau

Jedes Programm besteht prinzipiell aus drei Teilen: Kopf, Variablenvereinbarung und Rumpf.

PROGRAM Ggt;
(* Berechnet den GGT zweier Zahlen *)
VAR
    z1, z2;
BEGIN
    (* Startwerte *)
	z1 := 24;
    z2 := 18;
	(* eigentliche Berechnung *)
    WHILE z1 <> z2
    DO
        IF z1 >= z2
        THEN
            z1 := z1 - z2
        ELSE
            z2 := z2 - z1
        END
    END
END Ggt.

Der Programmkopf besteht aus dem Schlüsselwort PROGRAM und einem Programmnamen, der am Ende wiederholt wird.

Die Variablenvereinbarung wird eingeleitet durch das Schlüsselwort VAR, gefolgt von einer durch Komma getrennten Liste von Variablennamen.

Der durch BEGIN und END name eingeschlossene Rumpf enthält den Algorithmus. Alle Anweisungen werden mit ";" getrennt. Für Terme werden die üblichen Rechenzeichen verwendet (+, -, *, /), das Zeichen "%" berechnet den Rest der ganzzahligen Division. Zuweisungen werden als ":=" notiert.

Zwischen den Terminalsymbolen können beliebig Kommentare eingestreut werden. Kommentare beginnen mit der Zeichenfolge "(*" und enden mit der Zeichenfolge "*)"; sie können über mehrere Zeilen gehen. Kommentare dürfen nicht geschachtelt werden.

4.3 Die erweiterte Minisprache

Bei Aktivierung der Erweiterungen wird die Minisprache um Felder und um Unterprogramme erweitert.

Felder werden durch eine eckige Klammer mit Angabe der Feldlänge hinter dem Variablennamen vereinbart.
Zugriff auf die Feldelemente erfolgt ebenfalls durch eckige Klammern; der Index läuft von 0 bis Länge-1. Eine Indexkontrolle findet nicht statt.

Prozeduren werden nach den Variablen und vor dem Programmrumpf vereinbart. Sie können auf die globalen Variablen zugreifen sowie lokale Variable und Parameter vereinbaren.
Es werden reguläre Prozeduren ohne Rückgabewert (Schlüsselwort PROCEDURE) und Funktionsprozeduren mit einer ganzen Zahl als Rückgabewert (Schlüsselwort FUNCTION) unterschieden. Der Aufruf regulärer Prozeduren ist eine Anweisung, Funktionsprozeduren werden in Termen verwendet.

4.4 Syntax der Minisprache

Die vollständige Syntax der Minisprache in EBNF (Erweiterungen sind kursiv gesetzt):

Programm = 
    Kopf { Variablenvereinbarung } { Prozedurvereinbarung } Rumpf .
Kopf = 
    "PROGRAM" Bezeichner ";" .
Rumpf = 
    "BEGIN" Anweisungsfolge "END" Bezeichner "." .
Variablenvereinbarung = 
    "VAR" Variable { "," Variable } ";" .
Variable =
    Bezeichner [ "[" Zahl "]" ] .
Prozedurvereinbarung =
    ( "PROCEDURE" | "FUNCTION" ) Bezeichner "(" { Paramterliste } ")" [ Variablenvereinbarung ]
    "BEGIN" Anweisungsfolge "END" Bezeichner ";" .
Paramterliste =
    Parameter { "," Parameter } .
Parameter =
    [ "VAR" ] Bezeichner [ "[" Zahl "]" ] .
Anweisungsfolge =
    Anweisung { ";" Anweisung } . 
Anweisung = 
    [ Zuweisung | BedingteAnweisung | WiederholungMitEingangsbedingung | 
    WiederholungMitAusgangsbedingung | ZaehlWiederholung | Prozeduraufruf | ReturnAnweisung ] .
Zuweisung =
    Bezeichner [ "[" Ausdruck "]" ] ":=" Ausdruck .
BedingteAnweisung = 
    "IF" Bedingung "THEN" Anweisungsfolge
    [ "ELSE" Anweisungsfolge ] "END" .
WiederholungMitEingangsbedingung =
    "WHILE" Bedingung "DO" Anweisungsfolge "END" .
WiederholungMitAusgangsbedingung =
    "REPEAT" Anweisungsfolge "UNTIL" Bedingung .
ZaehlWiederholung =
    "FOR" Bezeichner ":=" Ausdruck "TO" Ausdruck
    [ "BY" [ "+" | "-" ] Zahl ] "DO" Anweisungsfolge "END" .
Prozeduraufruf =
    Bezeichner "(" [ Ausdruck { "," Ausdruck } ] ")" .
ReturnAnweisung =
    "RETURN" [ Ausdruck ] .
Bedingung =
    Ausdruck ( "=" | "<>" | ">" | ">=" | "<" | "<=" ) Ausdruck .
Ausdruck =
    [ "+" | "-" ] Term { ( "+" | "-" ) Term } .
Term =
	Faktor { ( "*" | "/" | "%" ) Faktor } .
Faktor =
	Bezeichner [ "[" Ausdruck "]" ] | Zahl | "(" Ausdruck ")" | Funktionsaufruf .
Funktionsaufruf =
    Bezeichner "(" [ Ausdruck { "," Ausdruck } ] ")" .
Bezeichner =
    "A" .. "Z" | "a" .. "z" { "A" .. "Z" | "a" .. "z" | "0" .. "9" | "_" | "$" } .
Zahl =
    "0" .. "9" { "0" .. "9" } . 

Die Kommentare treten im Syntaxdiagramm nicht auf, da sie entsprechend den Leerzeichen, Tabulatoren oder Zeilenwechseln bereits bei der Zerlegung des Quelltextes in Terminalsymbole abgearbeitet werden.