1 II.3. Die Syntax einer Programmiersprache Programme in einer Programmiersprache haben eine genau definierte Form - das ist nötig, damit sie automatisch verarbeitet werden können. Es gibt verschiedene Möglichkeiten, diese sogenannte Syntax zu definieren. Jede solche Beschreibung muß zum einen die Zeichen der zu definierenden Sprache benutzen - das sind die sogenannten Terminalzeichen; zum anderen Zeichen, die nur zur Beschreibung benutzt werden - die sogenannten Metazeichen. Unter den Metazeichen gibt es insbesondere syntaktische Variable (Nichtterminalsymbole). 3.1. Backus-Naur-Form (BNF) Die Metazeichen der BNF sind • das Definitionszeichen ::= („ist definiert als“) • das Alternativzeichen | („oder“) • die sytaktischen Variablen, hier geschrieben als <string> (string ist irgendeine Zeichenkette) Eine BNF-Definition besteht aus 1. der Angabe eines Grundalphabetes Σ - der Menge der Terminalzeichen 2. einer endlichen Menge von BNF-Regeln der Form <string> ::= α oder <string> ::= α1 | α2 | ... | αn wobei α, α1, ..., αn Wörter (d.h. Zeichenketten) sind, die aus Elementen von Σ und syntaktischen Variablen bestehen. 3. der Angabe einer syntaktischen Variablen <S> als Startsymbol Eine solche BNF definiert nun die Menge aller Satzformen (das ist eine Menge von Wörtern, gebildet aus Terminalzeichen und syntaktischen Variablen) als kleinste Menge M mit a) <S> ∈ M b) Wenn α<A>β ∈ M und <A> ::= γ bzw. <A> ::= γ1 | ... |γn BNF-Regel ist, so ist auch αγβ ∈ M bzw. αγiβ ∈ M für alle 1≤ i ≤ n Die durch die BNF definierte Sprache ist nun die Menge aller Satzformen, die nur aus Terminalzeichen (Elementen aus Σ) bestehen. Beispiel: Ganze Zahlen in Pascal 1. Σ = {0,1,2,3,4,5,6,7,8,9,+,-} 2. <integer> ::= <Vorzeichen> <pos. Zahl> | <pos. Zahl> <Vorzeichen> ::= + | <pos. Zahl> ::= <Ziffer> | <Ziffer> <pos. Zahl> <Ziffer> ::= 0|1|2|3|4|5|6|7|8|9 3. Startsymbol ist <integer> Diese BNF definiert als Sprache gerade die Menge aller ganzen Pascal-Zahlen 2 Z.B. liegt 23 in der Sprache wegen <integer> → <pos. Zahl> → <Ziffer> <pos. Zahl> → 2<pos. Zahl> → 2<Ziffer> → 23 Aber auch -000 liegt in der Sprache und ist damit eine korrekte Zahl in Pascal 3.2. Erweiterte BNF (EBNF) Man erhält eine größere Ausdrucksstärke, wenn man zur BNF Metazeichen hinzufügt: { } : Wiederholungsklammern (Wiederholung beliebig oft (auch 0-mal) möglich) [ ] : Optionsklammern Dann könnte man die obige Sprache wie folgt darstellen: <integer> ::= [<Vorzeichen>] <pos. Zahl> <Vorzeichen> ::= + | <pos. Zahl> ::= <Ziffer> {<Ziffer>} <Ziffer> ::= 0|1|2|3|4|5|6|7|8|9 oder auch <integer> ::= [+|-] <Ziffer> {<Ziffer>} <Ziffer> ::= 0|1|2|3|4|5|6|7|8|9 3.3 Syntaxdiagramme Am anschaulichsten ist wohl die Darstellung der EBNF mit Hilfe von Syntaxdiagrammen. Diese bestehen aus • runden Kästchen für die Terminalsymbole: oder • eckige Kästchen für sytaktische Variable: • gerichtete Verbindungslinien der Kästen: - Jeder Kasten hat genau einen Eingang und genau einen Ausgang - Linien können sich verzweigen und zusammenführen - Jedes Diagramm hat genau eine Eingangslinie und eine Ausgangslinie - Jedes Diagramm erhält als Namen den der syntaktischen Variablen, die es beschreibt Die letzte Form der EBNF hat folgende Darstellung durch Syntaxdiagramme: 3 integer + - Ziffer Ziffer 0 1 . . . 9 Jeder Durchlauf durch ein solches Diagramm liefert ein syntaktisch korrektes Objekt. Für die Programmiersprache C ist die Syntaxbeschreibung in EBNF (oder einer Variation davon) üblich. Für Pascal ist die Beschreibung mittels Syntaxdiagrammen häufiger.