31.01.2014 Aufrufe

Kapitel 4: Syntax von Programmiersprachen

Kapitel 4: Syntax von Programmiersprachen

Kapitel 4: Syntax von Programmiersprachen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!