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
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
!
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)
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?
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
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
Syntaxregeln
expression : ID | INT | expression op expression;
op : '+' | '-' | '*' | '/';
ID : 'a' | ... | 'z';
INT : '0' | ... | '41';
Wir geben später noch
“bessere” Regeln an.
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 : '+' | '-' | '*' | '/';
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
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
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
+
Mehrere Ableitungsbäume für 2*n+1
expression
expression op
+
INT1
expression
expression op expression
*
IDn
INT
2
expression
expression op
*
expressionexpression op expression
+
INT1
ID
n
*
INT
2
expression : ID | INT | expression op expression;
op : '+' | '-' | '*' | '/';
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
“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;
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”.
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.
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;
Mehr Ausdrucksformen
expression : ID
| INT
| '(' expression ')
| expression op expression
; op :
'+' | '-' | '*' | '/'
| '==' | '!=' | '<' | '>' | '<=' | '>='
;
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
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
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;
}
(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?
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’
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.
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.
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
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___________________________________________>< |
|_____________________________________________________________|