Kapitel 4: Syntax von Programmiersprachen
Kapitel 4: Syntax von Programmiersprachen
Kapitel 4: Syntax von Programmiersprachen
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
4 <strong>Syntax</strong> <strong>von</strong> <strong>Programmiersprachen</strong><br />
<strong>Syntax</strong> (“Lehre vom Satzbau”):<br />
• formale Beschreibung des Aufbaus der “Worte” und “Sätze”, die zu einer<br />
Sprache gehören;<br />
• im Falle einer Programmier-Sprache Festlegung, wie Programme aussehen<br />
müssen.<br />
Hilfsmittel bei natürlicher Sprache:<br />
• Wörterbücher;<br />
• Rechtschreibregeln, Trennungsregeln, Grammatikregeln;<br />
• Ausnahme-Listen;<br />
• Sprach-“Gefühl”.<br />
59
Hilfsmittel bei <strong>Programmiersprachen</strong>:<br />
• Listen <strong>von</strong> Schlüsselworten wie,ÒØ,Ð×,ÛÐ...<br />
• Regeln, wie einzelne Worte (Tokens) z.B. Namen gebildet werden.<br />
Frage:<br />
Istܽ¼ein zulässiger Name für eine Variable?<br />
oder°oderoder¼...<br />
• Grammatikregeln, die angeben, wie größere Komponenten aus kleineren<br />
aufgebaut werden.<br />
Frage:<br />
Ist einÛÐ-Statement imÐ×-Teil erlaubt?<br />
• Kontextbedingungen.<br />
Beispiel:<br />
Eine Variable muss erst deklariert sein, bevor sie verwendet wird.<br />
==⇒<br />
==⇒<br />
formalisierter als natürliche Sprache<br />
besser für maschinelle Verarbeitung geeignet<br />
60
Semantik (“Lehre <strong>von</strong> der Bedeutung”):<br />
• Ein Satz einer (natürlichen) Sprache verfügt zusätzlich über eine Bedeutung,<br />
d.h. teilt einem Hörer/Leser einen Sachverhalt mit (↑Information)<br />
• Ein Satz einer Programmiersprache, d.h. ein Programm verfügt ebenfalls über<br />
eine Bedeutung.<br />
Die Bedeutung eines Programms ist<br />
– alle möglichen Ausführungen der beschriebenen Berechnung<br />
(↑operationelle Semantik); oder<br />
– die definierte Abbildung der Eingaben auf die Ausgaben<br />
(↑denotationelle Semantik).<br />
Achtung!<br />
Ist ein Programm syntaktisch korrekt, heißt das noch lange nicht, dass es auch das<br />
“richtige” tut, d.h. semantisch korrekt ist!!!<br />
61
•ÒØ<br />
→<br />
4.1 Reservierte Wörter<br />
•,Ð×,ÛÐ<br />
•´,µ,,³,ß,Ð,¸,<br />
→<br />
→<br />
Bezeichner für Basis-Typen;<br />
Schlüsselwörter aus Programm-Konstrukten;<br />
Sonderzeichen.<br />
62
4.2 Was ist ein erlaubter Name?<br />
Schritt 1:<br />
Klassifizierung der möglichen vorkommenden Zeichen:<br />
|<br />
|<br />
letter ::= °||| . . . |Þ||. . .<br />
digit ::= ¼| . . .<br />
• letter und digit bezeichnen Zeichenklassen, d.h. Mengen <strong>von</strong> Zeichen, die<br />
gleich behandelt werden.<br />
• Das Symbol “|” trennt zulässige Alternativen.<br />
• Das Symbol “. . .” repräsentiert die Faulheit, alle Alternativen wirklich<br />
aufzuzählen :-)<br />
63
Schritt 2:<br />
Angabe, wie die Zeichen angeordnet werden dürfen:<br />
name ::= letter ( letter | digit )*<br />
• Erst kommt ein Zeichen der Klasse letter, dann eine (eventuell auch leere)<br />
Folge <strong>von</strong> Zeichen entweder aus letter oder aus digit.<br />
• Der Operator “*” bedeutet “beliebig ofte Wiederholung”<br />
(“weglassen” ist 0-malige Wiederholung :-).<br />
• Der Operator “*” ist ein Postfix-Operator. Das heißt, er steht hinter seinem<br />
Argument.<br />
64
•½ ××ØÒÆÑ<br />
Beispiele:<br />
Ü°È××ÛÓÖ°... sind<br />
• ÀÐÐÓ Ü³ ¹½<br />
...<br />
Achtung:<br />
alles legale Namen.<br />
sind keine legalen Namen.<br />
Reservierte Wörter sind als Namen verboten!!!<br />
65
4.3 Ganze Zahlen<br />
Werte, die direkt im Programm stehen, heißen auch Konstanten.<br />
Ganze Zahlen bestehen aus einem Vorzeichen<br />
·|¹<br />
(das evt. auch fehlt) und einer<br />
nichtleeren Folge <strong>von</strong> Ziffern:<br />
sign ::=<br />
number ::= sign ? digit digit*<br />
• Der Postfix-Operator “?” besagt, dass das Argument eventuell auch fehlen<br />
darf, d.h. einmal oder keinmal vorkommt.<br />
• Wie sähe die Regel aus, wenn wir führende Nullen verbieten wollen?<br />
66
•¹½ ·½¾¼<br />
Beispiele:<br />
¾ ¼¹¼¼¼¼<br />
•ÀÐÐÓÏÓÖÐ ¹¼º·½¾<br />
...<br />
...<br />
sind alles legaleÒØ-Konstanten.<br />
sind keineÒØ-Konstanten.<br />
67
Ausdrücke, die aus Zeichen (-klassen) mithilfe <strong>von</strong><br />
| (Alternative)<br />
* (Iteration)<br />
(Konkatenation) sowie<br />
? (Option)<br />
... aufgebaut sind, heißen reguläre Ausdrücke a (↑Automatentheorie).<br />
a Gelegentlich sind auch ǫ, d.h. das “leere Wort” sowie ∅, d.h. die leere Menge zugelassen.<br />
68
Reguläre Ausdrücke reichen zur Beschreibung vieler “einfacher” Mengen <strong>von</strong><br />
Worten aus.<br />
• ( letter letter )*<br />
– alle Wörter gerader Länge (über¸ººº¸Þ¸¸ººº¸);<br />
• letter*Ø×Øletter*<br />
– alle Wörter, die das TeilwortØ×Øenthalten;<br />
•digit*½<br />
– alle Wörter, die mitanfangen, dann eine beliebige Folge <strong>von</strong> Ziffern<br />
aufweisen, die mit½aufhört;<br />
• sign? digit* ( digitº|ºdigit ) digit* ( (|)sign? digit digit* ) ?<br />
– alle Gleitkomma-Zahlen ...<br />
69
Identifizierung <strong>von</strong><br />
• reservierten Wörtern,<br />
• Namen,<br />
• Konstanten<br />
Ignorierung <strong>von</strong><br />
• White Space,<br />
• Kommentaren<br />
... erfolgt in einer ersten Phase (↑Scanner)<br />
==⇒ Input wird mit regulären Ausdrücken verglichen und dabei in Wörter<br />
(“Tokens”) aufgeteilt.<br />
In einer zweiten Phase wird die Struktur des Programms analysiert (↑Parser).<br />
70
4.4 Struktur <strong>von</strong> Programmen<br />
Programme sind hierarchisch aus Komponenten aufgebaut.<br />
Für jede Komponente geben wir Regeln an, wie sie aus anderen Komponenten<br />
zusammengesetzt sein können.<br />
ÒØ<br />
program ::= decl* stmt*<br />
decl ::= type name (¸name )*<br />
type ::=<br />
• Ein Programm besteht aus einer Folge <strong>von</strong> Deklarationen, gefolgt <strong>von</strong> einer<br />
Folge <strong>von</strong> Statements.<br />
• Eine Deklaration gibt den Typ an, hier:ÒØ, gefolgt <strong>von</strong> einer<br />
Komma-separierten Liste <strong>von</strong> Variablen-Namen.<br />
71
stmt ::=<br />
|ßstmt*Ð|<br />
nameexpr|nameÖ´µ|ÛÖØ´exprµ|<br />
´condµstmt |<br />
´condµstmtÐ×stmt |<br />
Ûдcondµstmt<br />
• Ein Statement ist entweder “leer” (d.h. gleich) oder eine geklammerte Folge<br />
<strong>von</strong> Statements;<br />
• oder eine Zuweisung, eine Lese- oder Schreib-Operation;<br />
• eine (einseitige oder zweiseitige) bedingte Verzweigung;<br />
• oder eine Schleife.<br />
72
¹<br />
expr ::= number | name |´exprµ|<br />
¹|·||»|±<br />
unop expr | expr binop expr<br />
unop ::=<br />
binop ::=<br />
• Ein Ausdruck ist eine Konstante, eine Variable oder ein geklammerter<br />
Ausdruck<br />
• oder ein unärer Operator, angewandt auf einen Ausdruck,<br />
• oder ein binärer Operator, angewand auf zwei Argument-Ausdrücke.<br />
• Einziger unärer Operator ist (bisher :-) die Negation.<br />
• Mögliche binäre Operatoren sind Addition, Subtraktion, Multiplikation,<br />
(ganz-zahlige) Division und Modulo.<br />
73
cond ::= ØÖÙ|Ð×|´condµ|<br />
|||||<br />
expr comp expr |<br />
comp ::=<br />
bunop cond | cond bbinop cond<br />
²²|<br />
bunop ::=<br />
bbinop ::=<br />
• Bedingungen unterscheiden sich <strong>von</strong> Ausdrücken, dass ihr Wert nicht vom<br />
TypÒØist sondernØÖÙoderÐ×(ein Wahrheitswert – vom TypÓÓÐÒ).<br />
• Bedingungen sind darum Konstanten, Vergleiche<br />
• oder logische Verknüpfungen anderer Bedingungen.<br />
74
Puh!!! Geschafft ...<br />
75
Beispiel:<br />
ÒØÜ ÜÖ´µ ´Ü¼µ<br />
Ð×ÛÖØ´¼µ<br />
ÛÖØ´½µ<br />
Die hierarchische Untergliederung <strong>von</strong> Programm-Bestandteilen veranschaulichen<br />
wir durch <strong>Syntax</strong>-Bäume:<br />
76
<strong>Syntax</strong>-Bäume fürܼsowieÛÖØ´¼µundÛÖØ´½µ<br />
cond<br />
stmt<br />
stmt<br />
expr<br />
expr<br />
expr<br />
expr<br />
name<br />
comp<br />
number<br />
number<br />
number<br />
x ><br />
0<br />
write( 1 );<br />
write( 0 );<br />
Blätter:<br />
innere Knoten:<br />
Wörter/Tokens<br />
Namen <strong>von</strong> Programm-Bestandteilen<br />
77
program<br />
stmt<br />
cond<br />
stmt<br />
stmt<br />
decl<br />
stmt<br />
expr<br />
expr<br />
expr<br />
expr<br />
type<br />
name<br />
name<br />
name<br />
comp<br />
number<br />
number<br />
number<br />
int<br />
x<br />
;<br />
x = read(); if ( x > 0 ) write( 1 ); else<br />
write( 0 );<br />
78
Bemerkungen:<br />
• Die vorgestellte Methode der Beschreibung <strong>von</strong> <strong>Syntax</strong> heißt EBNF-Notation<br />
(Extended Backus Naur Form Notation).<br />
• Ein anderer Name dafür ist erweiterte kontextfreie Grammatik (↑Linguistik,<br />
Automatentheorie).<br />
• Linke Seiten <strong>von</strong> Regeln heißen auch Nicht-Terminale.<br />
• Tokens heißen auch Terminale.<br />
79
Achtung:<br />
• Die regulären Ausdrücke auf den rechten Regelseiten können sowohl<br />
Terminale wie Nicht-Terminale enthalten.<br />
• Deshalb sind kontextfreie Grammatiken mächtiger als reguläre Ausdrücke.<br />
Beispiel:<br />
L = {ǫ,,,,<br />
. . .}<br />
läßt sich mithilfe einer Grammatik beschreiben:<br />
A<br />
::= (A)?<br />
80
<strong>Syntax</strong>-Baum für das Wort:<br />
A<br />
A<br />
A<br />
A<br />
a<br />
a<br />
a<br />
b b b<br />
Für L gibt es aber keinen regulären Ausdruck!!! (↑Automatentheorie)<br />
81
Weiteres Beispiel:<br />
Zugehörige Grammatik:<br />
L = alle Worte mit gleich vielen’s und’s<br />
S<br />
A<br />
B<br />
::= (A|B)*<br />
::= (AA|)<br />
::= (BB|)<br />
<strong>Syntax</strong>-Baum für das Wort:<br />
S<br />
B<br />
B<br />
A<br />
B<br />
B<br />
B<br />
a a b a b b b a<br />
82