• Keine Ergebnisse gefunden

Syntax von Softwaresprachen

N/A
N/A
Protected

Academic year: 2021

Aktie "Syntax von Softwaresprachen"

Copied!
35
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Syntax von Softwaresprachen

OOPM, Ralf Lämmel

Software Languages Team University of Koblenz-Landau

http://en.wikipedia.org/wiki/File:Brueghel-tower-of-babel.jpg

(2)

Quiz zur Motivation

Sind dies gültige Java-Fragmente?

2*n + 1 2n + 1

while true do { } int n = ;

Der Java-Compiler kann diese Frage beantworten.

Wie beantworten wir solche Fragen?

... unter Verwendung einer Java-Implementation?

... mit Papier und Bleistift?

... mit einem eigenen Algorithmus?

Wir brauchen eine geeignete Syntaxdefinition

!

(3)

Was ist Java “konzeptionell”?

Java ist eine Programmiersprache.

Programmiersprachen sind Softwaresprachen.

Wichtige Aspekte solcher Sprachen:

Syntax (siehe auch “Formale Sprache”)

Welche Zeichenketten gehören zur Sprache?

Welche Regeln konstruieren diese Zeichenketten?

Semantik:

Bedeutung der Ableitungsbäume gemäß Regeln

(Bedeutung der Zeichenketten)

(4)

The term "software language" refers to artificial languages used in software development including general-purpose programming languages, domain-specific languages, modeling and meta-modeling languages, data models, and ontologies. Examples include general purpose modeling languages such as UML, but also domain-specific modeling languages for business process modeling, such as BPMN, or embedded systems, such as Simulink or Modelica, and specialized XML- based and OWL-based languages and vocabularies. The term "software language" also comprises APIs and collections of design patterns that define a language implicitly.

http://planet-sl.org/sle2012 Zugriff: 23.1.2012

Was sind Softwaresprachen?

(5)

Verwendung von Grammatiken für die Syntaxdefinition

Beispiele für arithmetische Ausdrücke n + 1

2 * n - 1

Wir brauchen Regeln für folgende syntaktische Kategorien:

Ausdrücke Operatoren Bezeichner Konstanten

Synonym: Produktion

(6)

Syntaxregeln

expression : ID | INT | expression op expression;

op : '+' | '-' | '*' | '/';

ID steht für die Menge aller Bezeichner.

INT steht für die Menge aller Folgen von Ziffern.

Verweise

auf Nichtterminale

Terminale Definierte

Nichtterminale

Zur Trennung von

Alternativen

(7)

Syntaxregeln

expression : ID | INT | expression op expression;

op : '+' | '-' | '*' | '/';

ID : 'a' | ... | 'z';

INT : '0' | ... | '41';

Wir geben später noch

“bessere” Regeln an.

(8)

Backus Naur Form (BNF) (eine Form von Grammatiken)

Nichtterminal durch Menge von Alternativen definiert Jede Alternative ist Sequenz von Symbolen

Terminale

Nichtterminale

ε ist die leere Sequenz.

expression : ID | INT | expression op expression;

op : '+' | '-' | '*' | '/';

(9)

Begriffe

Grammatik: Menge von Syntaxregeln Grammatikdialekte und -notationen

BNF: Backus Naur Form

EBNF: Extended BNF Grammatiksymbole

Terminal: Zeichenkette

Nichtterminal: Platzhalter für eine Menge von Zeichenketten Startsymbol: Ausgezeichnetes Nichtterminal

Ableitungsbaum:

Abeitung einer Zeichenkette aus Grammatikregeln

(10)

Ableitungsbaum für “n + 1”

expression

expression op expression

ID INT

n + 1

expression : expression op expression;

expression : ID;

op : ‘+’;

expression : INT;

ID : ‘n’;

INT : ‘1’;

Anwendung von Alternativen

Eingabe

(11)

Ableitungsbäume

Baumstruktur folgt den Regeln/Alternativen.

Blätter: Terminale

Die Liste aller Blätter ergibt den Eingabestring.

Andere Knoten: Nichterminale Wurzel: Startsymbol der EBNF

Für einen gegebenen Nichtterminal-Knoten entsprechen die Folgeknoten immer genau den Symbolen aus einer

Alternative für das gegebenen Nichtterminal.

expression

expression op expression

ID INT

n 1

+

(12)

Mehrere Ableitungsbäume für 2*n+1

expression

expression op

+

INT

1

expression

expression op expression

*

ID

n

INT

2

expression

expression op

*

expression

expression op expression

+

INT

1

ID

n

*

INT

2

expression : ID | INT | expression op expression;

op : '+' | '-' | '*' | '/';

(13)

expression : term terms;

terms : ε | plusminus term terms;

plusminus : '+' | '-';

term : factor factors;

factors : ε | timesdiv factor factors;

timesdiv : '*' | '/';

factor : ID | INT;

expression : ID | INT | expression op expression;

op : '+' | '-' | '*' | '/';

Schichtung der Ausdrucksformen

Herstellung der Eindeutigkeit

(14)

“Schichten” von Ausdrücken

factor: Nicht weiter zusammengesetzte Ausdrücke term: Stärkere Bindung mit “*” und “/”

expression: Schwächere Bindung mit “+” und “-”

Mehrdeutigkeitsausschluss

Additionen können nicht Unterausdrücke von “*” sein.

Herstellung der Eindeutigkeit

expression : term terms;

terms : ε | plusminus term terms;

plusminus : '+' | '-';

term : factor factors;

factors : ε | timesdiv factor factors;

timesdiv : '*' | '/';

factor : ID | INT;

(15)

Das Parsing-Problem

(Das Problem der syntaktischen Analyse)

Eingaben:

Grammatik G Zeichenkette w Ausgabe:

ja/nein: Ist w Element der durch G generierten Sprache?

Im “Ja” Fall: Ableitungsbaum

Es gibt viele solche Algorithmen.

Siehe auch “Parsergenerator”, “Compilerbau”.

(16)

EBNF: Extended BNF

Zusätzliche Symbolformen der EBNF Gruppierung von Symbolen ( ... )

Optionale Strukturen “?” (Postfix)

Wiederholte Strukturen (0,1,... mal) “*” (Postfix) Wiederholte Strukturen (1,... mal) “+” (Postfix)

Diese Ausdruckskraft ist redundant.

Verwende extra Nichtterminale.

(17)

Verkürzung der eindeutigen Syntax

expression : term (( '+' | '-' ) term)*;

term : factor (( '*' | '/') factor)*;

factor : ID | INT;

EBNF:

Wiederholung von Strukturen EBNF:

Gruppierung von Symbolen

expression : term terms;

terms : ε | plusminus term terms;

plusminus : '+' | '-';

term : factor factors;

factors : ε | timesdiv factor factors;

timesdiv : '*' | '/';

factor : ID | INT;

(18)

Mehr Ausdrucksformen

expression : ID

| INT

| '(' expression ')

| expression op expression

; op :

'+' | '-' | '*' | '/'

| '==' | '!=' | '<' | '>' | '<=' | '>='

;

(19)

Eindeutige Grammatik für neue Formen

cexpression : aexpression rop aexpression;

rop : '==' | '!=' | '<' | '>' | '<=' | '>=';

aexpression : term (( '+' | '-' ) term)*;

term : factor (( '*' | '/') factor)*;

factor : ID | INT | '(' aexpression ')';

“comparison”

expression

“arithmetic”

expression

Klammern in der definierten Sprache.

EBNF:

Wiederholung von Strukturen Klammern in der

EBNF

(20)

Syntax von Softwaresprachen im verallgemeinerten Sinne

Sprachform Grammatikform

Menge von Zeichenketten BNF, EBNF, ...

Menge von Bäumen

Baumgrammatiken, XML Schemata, Signaturen algebraischer Spezifikationen

Menge von Graphen Graphgrammatiken,

Objektmodelle

(21)

Structo -- Beispielprogrammiersprache

Programme = Anweisungsblöcke Ein einziger Datentyp: int.

Variablendeklarationen (ohne Initialisierung).

Anweisungsformen Zuweisung

IF-Anweisung

WHILE-Anweisung

Read/Write-Anweisung für I/O Ausdrücke wie zuvor

{

int n;

read n;

int r;

r = 1;

while (n > 0) { r = r * n;

n = n - 1;

}

write r;

}

(22)

(Fast) eindeutige EBNF für Structo

program : statements;

statements : statement | '{' statement* '}';

statement : 'int' ID ';' | 'read' ID ';'

| 'write' aexpression ';' | ID '=' aexpression ';'

| 'if' cexpression statements ('else' statements)?

| 'while' cexpression statements ;

Ausdrücke wie zuvor.

Knobelaufgabe:

Warum ist die Grammatik nicht

ganz eindeutig?

(23)

Die Nichtterminale ID und INT

ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9')* ; INT : ('0'..'9')+ ;

Alle Zeichen zwischen ‘a’

und ‘z’

(24)

Was steht zwischen Bezeichnern,

Zahlenkonstanten, Schlüsselwörtern und anderen Spezialsymbolen?

Konvention Leerzeichen Tabulatoren

Zeilenumbrüche

Dies kann auch in der Grammatik formalisiert werden.

Ebenso können Kommentare formalisiert werden.

(25)

EBNF als Modellierungssprache

EBNF modelliert Sprachen (Syntax von Sprachen).

EBNF kann zu BNF reduziert werden.

(E)BNF ist streng mathematisch formalisiert.

(E)BNF ist “ausführbar”.

(E)BNF definiert Struktur der Ableitungsbäume.

(26)

Illustration:

Ein Ausschnitt aus der Java-Syntax

Es wird wieder ein leicht verschiedener Grammatikdialekt benutzt.

Statement:

Block

assert Expression [ : Expression] ;

if ParExpression Statement [else Statement]

for ( ForControl ) Statement while ParExpression Statement

do Statement while ParExpression ;

try Block ( Catches | [Catches] finally Block ) switch ParExpression { SwitchBlockStatementGroups } synchronized ParExpression Block

return [Expression] ; throw Expression ; break [Identifier]

continue [Identifier] ;

StatementExpression ;

Identifier : Statement

(27)

Illustration:

Ein Ausschnitt aus der Cobol-Syntax

procedure-division

___________________________________________________________________________________________________________

| |

| >>__PROCEDURE__DIVISION_______________________________._________________________________________________> |

| | <____________ | |

| |__USING____data-name__|__| |

| >_______________________________________________________________________________________________________> |

| | <__________________________________________________ | |

| |__DECLARATIVES__.____section-header__.__use-statement__.__paragraphs__|__END__DECLARATIVES__.__| |

| >___sections___________________________________________________________________________________________>< |

|___________________________________________________________________________________________________________|

_____________________________________________________________

| |

| >>__PROCEDURE__DIVISION_______________________________.___> |

| | <____________ | |

| |__USING____data-name__|__| |

| >___paragraphs___________________________________________>< |

|_____________________________________________________________|

Es wird wieder eine visuelle

Grammatiknotation verwendet.

(28)

Programmatische Darstellung von Ableitungsbäumen

Repräsentation Objektmodell

Konstruktoren einer algebraischer Spezifikation

— beides abgeleitet direkt aus der Grammatik!

Wir können Terminale unrepräsentiert lassen, wenn sie keine Bedeutung innehaben.

Man benutzt auch den Begriff

der “Abstrakten Syntax”.

(29)

Zur Erinnerung: die EBNF von Structo

program : statements;

statements : statement | '{' statement* '}';

statement : 'int' ID ';' | 'read' ID ';'

| 'write' expression ';' | ID '=' expression ';'

| 'if' expression statements ('else' statements)?

| 'while' expression statements

;

expression : ID | INT | '(' expression ') | expression op expression;

op : '+' | '-' | '*' | '/' | '==' | '!=' | '<' | '>' | '<=' | '<=';

(30)

EBNF für die “wesentliche” (abstrakte) Struktur der Ableitungsbäume von Structo

[main] program : statement*;

[intdec] statement : ID;

[read] statement : ID:

[write] statement : expression;

[assign] statement : ID expression;

[if] statement : expression statement* statement*;

[while] statement : expression statement*;

expression : ID | INT | expression op expression;

op : '+' | '-' | '*' | '/' | '==' | '!=' | '<' | '>' | '<=' | '<=';

Regelbezeichnungen (als Referenzierungshilfe)

Knobelaufgabe:

Welche Abweichungen gegenüber

der EBNF nehmen Sie wahr?

(31)

Ein Objektmodell für Structo

(32)

Korrespondenz zwischen

Objektmodellen und Grammatiken

Es gibt eine abstrakte Klasse für jedes Nichtterminal.

Es gibt eine konkrete Klasse für jede Alternative.

Die konkrete Klasse spezialisiert die Klasse für das Nichtterminal.

Komposition verweist auf die Klassen aus den Alternativen.

Kardinalitäten werden aus */+/? abgeleitet.

(33)

Konstruktoren einer algebraischen Spezifikation für Strukto

program : → statement skip : → statement

sequence : statement × statement → statement declare : ID → statement

read : ID → statement

write : expression → statement

assign : ID × expression → statement

if : expression × statement → statement while : expression × statement → statement id : ID → expression

int : INT → expression

binary : op × expression × expression → expression

plus : → op

minus : → op

times : → op

...

Knobelaufgabe:

Welche Abweichungen gegenüber der EBNF

nehmen Sie wahr?

(34)

Korrespondenz zwischen

algebraischen Spezifikationen und Grammatiken

Die Sorten korrespondieren zu den Nichtterminalen.

program, statement, expression, ...

Die Konstruktoren korrespondieren zu den Regeln.

Regel: [write] statement : expression;

Konstruktor: write: expression → statement

(35)

Zusammenfassung

(Formale) Sprachen sind Mengen von Zeichenketten.

Grammatiken modellieren Sprachen.

EBNF ist ein Notation für Grammatiken.

Grammatiken sind mathematische Gebilde.

Grammatiken korrespondieren zu Objektmodellen.

… und zu

Referenzen

ÄHNLICHE DOKUMENTE

nicht zweimal dasselbe Nichtterminal auf der rechten Seite Links- oder Rechtsassoziaitivit¨ at von Operatoren wird durch links- bzw.. rechtsrekursive Regeln

insgesamt um 0,75 Prozentpunkte zu senken, zeigt auf, dass die Steu- erzahler im Rheinland deutlich zu dieser Umlagesenkung beige- tragen haben. Zum anderen führt auch die

Beweis: Es wird gezeigt, dass die Herleitung eines Wortes, welches aus einem bestimmten Nicht- terminal hergeleitet werden kann, bis auf dieses erste Nichtterminal eindeutig ist...

Lidzbabski, der sich mit der Erforschung östlicher neuaramäischer Manuskripte beschäftigte, bemerkt, daß diese Dialekte in 2 Hauptgruppen.. zerfallen: die tur-abdinische (er nennt

Dem Verlag ist eine vorbildliche und sehr ansprechende Ausstattung mit einer ausgezeichneten Wiedergabe einer Fülle von EEG-Kurven gelun- NEUROLOGIE..

void * malloc(size_t size) liefert Zeiger auf Speicherbereich der Gr¨oße size, oder NULL, wenn die Anfrage nicht erf¨ullt werden kann.. Der Bereich ist

Schreiben Sie eine Funktion, die einen gegebenen String kodiert, indem das Alphabet um n Stellen verschoben wird.. Beispiel: Wird das Alphabet um 2 Stellen verschoben, so wird aus

Teil 2: Schreiben Sie eine C-Funktion, die aus einer Telefonnummer alle Zeichen, die keine Ziffern sind, entfernt. die Funktion hat nur einen Parameter und keinen