1 Syntax von Programmiersprachen



Ähnliche Dokumente
3.1 Reservierte Wörter

3 Syntax von Programmiersprachen

Die Klasse MiniJava ist in der Datei MiniJava.java definiert:

3.4 Struktur von Programmen

Programmiersprachen und Übersetzer

Formale Sprachen und Grammatiken

Theorie der Informatik

Diana Lange. Generative Gestaltung Operatoren

Grundlagen der Informatik II. Teil I: Formale Modelle der Informatik

Kapitel 2. Methoden zur Beschreibung von Syntax

Erwin Grüner

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln

1 Mathematische Grundlagen

Sprachen/Grammatiken eine Wiederholung

IT-Basics 2. DI Gerhard Fließ

Grundbegriffe der Informatik

Theoretische Informatik 2 (WS 2006/07) Automatentheorie und Formale Sprachen 19

7 Rechnen mit Polynomen

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Terme stehen für Namen von Objekten des Diskursbereichs (Subjekte, Objekte des natürlichsprachlichen Satzes)

Theoretische Informatik I

Objektorientierte Programmierung

Programmierkurs Java

1. Formale Sprachen 1.2 Grammatiken formaler Sprachen

7. Formale Sprachen und Grammatiken

Motivation. Formale Grundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen. Informales Beispiel. Informales Beispiel.

Computeranwendung und Programmierung (CuP)

Theoretische Grundlagen der Informatik

Primzahlen und RSA-Verschlüsselung

4. AUSSAGENLOGIK: SYNTAX. Der Unterschied zwischen Objektsprache und Metasprache lässt sich folgendermaßen charakterisieren:

Was ist ein Compiler?

Definition von domänenspezifischen Sprachen mit Xtext: Einführung. 19. November 2014

Informatik I Tutorium WS 07/08

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Datenbanken Microsoft Access 2010

Einführung in die C++ Programmierung für Ingenieure

Einführung in die Informatik Grammars & Parsers

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen.

SWE1 / Übung 2 ( )

Binäre Suchbäume (binary search trees, kurz: bst)

Grammatiken. Einführung

Äquivalente Grammatiken / attributierte Grammatik

Formale Sprachen, reguläre und kontextfreie Grammatiken

Der Zwei-Quadrate-Satz von Fermat

Einführung in die Programmierung

Einführung in die Algebra

Informationsblatt Induktionsbeweis

Alphabet, formale Sprache

Java Einführung Operatoren Kapitel 2 und 3

Grundlagen der Künstlichen Intelligenz

Lösungen zu Kapitel 7

Grundlagen der Theoretischen Informatik, SoSe 2008

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Rundung und Casting von Zahlen

Informatik IV Theoretische Informatik: Formale Sprachen und Automaten, Berechenbarkeit und NP-Vollständigkeit

Logische Folgerung. Definition 2.11

Inhalt. 1. Einführung in die Informatik. 2. Algorithmen Definition, Eigenschaften, Entwurf Darstellung von Algorithmen Beispiele.

Auswahlabfragen mit ACCESS

Graphic Coding. Klausur. 9. Februar Kurs A

Übung Theoretische Grundlagen

Prüfung Computation, Programming

Übung zur Vorlesung Einführung in die Computerlinguistik und Sprachtechnologie

Grundbegriffe der Informatik

Grundbegriffe der Informatik

Grundlagen der Videotechnik. Redundanz

Java-Programmierung mit NetBeans

Kapitel 2: Formale Sprachen Kontextfreie Sprachen. reguläre Grammatiken/Sprachen. kontextfreie Grammatiken/Sprachen

Grammatiken in Prolog

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse Lösung 10 Punkte

Einführung in die Programmierung

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

t r Lineare Codierung von Binärbbäumen (Wörter über dem Alphabet {, }) Beispiel code( ) = code(, t l, t r ) = code(t l ) code(t r )

2. Vorlesung. Slide 40

R ist freie Software und kann von der Website.

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Formale Sprachen. Der Unterschied zwischen Grammatiken und Sprachen. Rudolf Freund, Marian Kogler

C/C++ Programmierung

Die Gleichung A x = a hat für A 0 die eindeutig bestimmte Lösung. Für A=0 und a 0 existiert keine Lösung.

Mediator 9 - Lernprogramm

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Mathematischer Vorbereitungskurs für Ökonomen

Lehrer: Einschreibemethoden

Skript und Aufgabensammlung Terme und Gleichungen Mathefritz Verlag Jörg Christmann Nur zum Privaten Gebrauch! Alle Rechte vorbehalten!

Grundlagen Theoretischer Informatik I SoSe 2011 in Trier. Henning Fernau Universität Trier fernau@uni-trier.de

2.11 Kontextfreie Grammatiken und Parsebäume

Excel Funktionen durch eigene Funktionen erweitern.

Scala kann auch faul sein

Mathematische Maschinen

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

1 Vom Problem zum Programm

Einführung in das Programmieren Prolog Sommersemester Teil 2: Arithmetik. Version 1.0

1. LPC - Lehmanns Programmier Contest - Lehmanns Logo

Transkript:

1 Syntax von Programmiersprachen Syntax ( Lehre vom Satzbau ): formale Beschreibung des Aufbaus der Worte und Sätze, die zu einer Sprache gehören; im Falle einer Programmier-Sprache Festlegung, wie Programme aussehen müssen. 1

Syntax ( Lehre vom Satzbau ): Die lexikalische Struktur einer Programmiersprache bestimmt die textuellen Grundbausteine der Programme, etwa Schlüsselwörter und Bezeichner. Sie werden z. B. durch Aufzählung oder reguläre Ausdrücke bestimmt. Die Syntax einer Programmiersprache beschreibt, wie aus den Grundbausteinen vollständige Programme gebildet werden können. In den meisten Fällen wird die Syntax einer Programmiersprache durch eine kontextfreie Grammatik festgelegt. 2

Die Grammatik definiert eine Relation zwischen einer Tokenfolge und abstrakten Syntaxbäumen (siehe später): 3

Hilfsmittel bei Programmiersprachen: Listen von Schlüsselworten wie if, int, else, while... Regeln, wie einzelne Worte (Tokens) z.b. Namen gebildet werden. Frage: Ist x10 ein zulässiger Name für eine Variable? oder _ab$ oder A#B oder 0A?B... Grammatikregeln, die angeben, wie größere Komponenten aus kleineren aufgebaut werden. Frage: Ist ein while-statement im else-teil erlaubt? 4

Kontextbedingungen. Beispiel: Eine Variable muss erst deklariert sein, bevor sie verwendet wird. == == formalisierter als natürliche Sprache besser für maschinelle Verarbeitung geeignet 5

Semantik ( Lehre von der Bedeutung ): Ein Satz einer (natürlichen) Sprache verfügt zusätzlich über eine Bedeutung, d.h. teilt einem Hörer/Leser einen Sachverhalt mit ( Information) Ein Satz einer Programmiersprache, d.h. ein Programm verfügt ebenfalls über eine Bedeutung 6

Die Bedeutung eines Programms ist alle möglichen Ausführungen der beschriebenen Berechnung ( operationelle Semantik) Wie wird ein Programm ausgeführt? Ein Programm wird betrachtet als schrittweise Änderung des Maschinenzustands die definierte Abbildung der Eingaben auf die Ausgaben ( denotationelle Semantik) Was ist der Effekt der Ausführung? Ein Programm wird betrachtet als (partielle) Funktion in einem mathematischen Raum 7

Achtung! Ist ein Programm syntaktisch korrekt, heißt das noch lange nicht, dass es auch das richtige tut, d.h. semantisch korrekt ist!!! 8

Alphabet, Wort, Sprache, Grammatik: Ein Alphabet ist eine endliche, nichtleere Menge von Zeichen (Symbolen). Sei A ein Alphabet. Ein Wort (eine Zeichenreihe) w über A ist eine endliche Folge w = w 0... w n 1 mit w i A, n N 0 Das Wort der Länge 0 bezeichnet man mit ϵ Die Menge aller Wörter über einem Alphabet A wird mit A bezeichnet: A = {w w = w 0... w n 1, w i A, n N 0 }. 9

Alphabet, Wort, Sprache, Grammatik: Sei A ein Alphabet. Eine Teilmenge L A heißt formale Sprache über A. Eine Sprache ist also eine beliebige Menge von gewissen Wörtern, die sich aus der Symbolmenge A gewinnen lassen. Es sei A = {a, b, c}. Dann sind beispielsweise folgende Mengen Sprachen über A: L 1 = {aa, ab, aabcaacb} L 2 = {ϵ} L 3 = L 4 = {a n b n c n n N 0 } (w n i : n-malige Konkatenation von w i ) 10

Alphabet, Wort, Sprache, Grammatik: Um eine (unendliche) Sprache angeben zu können, benötigt man eine endliche Beschreibung dieser Sprache. Diese existiert nur dann, wenn alle Wörter der Sprache einem bestimmten Bildungsgesetz folgen. In der Theorie der formalen Sprachen werden Grammatiken zur Beschreibung von Sprachen verwendet: Über Grammatiken lassen sich die Wörter einer Sprache L erzeugen. Ein Wort gehört zu L, wenn es sich durch eine Folge von zulässigen Ersetzungen (Ableitungen) aus einem sogenannten Startsymbol erzeugen lässt. Definition: Eine Grammatik ist ein 4-Tupel G = (V, T, P, S). 11

V ist das Alphabet der Variablen oder Nicht-Terminale Begriffe, die durch Regeln erklärt werden. T ist das Alphabet der Terminal oder Tokens Symbole und Namen, die so in den Wörtern der Sprache übernommen werden. Hierbei gilt: V T =, A = V T ist das Gesamtalphabet P A + A eine endliche Relation; die Elemente von P heißen Produktionen oder Ersetzungsregeln V ist eine spezielle Variable, das Startsymbol. 12

1.1 Reservierte Wörter int Bezeichner für Basis-Typen; if, else, while Schlüsselwörter aus Programm-Konstrukten; (,), ",', {,},,,; Sonderzeichen. 13

1.2 Was ist ein erlaubter Name? Schritt 1: Angabe der erlaubten Zeichen: letter :: = $ _ a... z A... Z digit :: = 0... 9 14

1.2 Was ist ein erlaubter Name? Schritt 1: Angabe der erlaubten Zeichen: letter :: = $ _ a... z A... Z digit :: = 0... 9 letter und digit bezeichnen Zeichenklassen, d.h. Mengen von Zeichen, die gleich behandelt werden. Das Symbol trennt zulässige Alternativen. Das Symbol... repräsentiert die Faulheit, alle Alternativen wirklich aufzuzählen 15

Schritt 2: Angabe der Anordnung der Zeichen: name :: = letter ( letter digit )* Erst kommt ein Zeichen der Klasse letter, dann eine (eventuell auch leere) Folge von Zeichen entweder aus letter oder aus digit. Der Operator * bedeutet beliebig ofte Wiederholung ( weglassen ist 0-malige Wiederholung. Der Operator * ist ein Postfix-Operator. Das heißt, er steht hinter seinem Argument. 16

Beispiele: _178 Das_ist_kein_Name x _ $Password$... sind legale Namen! 17

5ABC!Hallo! x' -178... sind keine legalen Namen! Achtung: Reservierte Wörter sind als Namen verboten!!! 18

5ABC!Hallo! x' -178... sind keine legalen Namen! Achtung: Reservierte Wörter sind als Namen verboten!!! 19

1.3 Ganze Zahlen Werte, die direkt im Programm stehen, heißen Literale. Ganze nichtnegative Zahlen bestehen aus einer nichtleeren Folge von Ziffern: number :: = digit digit* 20

1.3 Ganze Zahlen Werte, die direkt im Programm stehen, heißen Literale. Ganze nichtnegative Zahlen bestehen aus einer nichtleeren Folge von Ziffern: number :: = digit digit* Wie sähe die Regel aus, wenn wir führende Nullen verbieten wollen? 21

Beispiele: 17 12490 42 0 00070... sind alles legale int-literale. "Hello World!" 0.5e+128... sind keine int-literale. 22

Ausdrücke, die aus Zeichen (-klassen) mithilfe von (Alternative) * (Iteration) (Konkatenation) sowie? (Option)... aufgebaut sind, heißen reguläre Ausdrücke a ( Automatentheorie). Der Postfix-Operator? besagt, dass das Argument eventuell auch fehlen darf, d.h. einmal oder keinmal vorkommt. a Gelegentlich sind auch ϵ, d.h. das leere Wort sowie, d.h. die leere Menge zugelassen. 23

Reguläre Ausdrücke reichen zur Beschreibung einfacher Mengen von Worten aus. ( letter letter )* alle Wörter gerader Länge (über a,...,z,a,...,z); letter* test letter* alle Wörter, die das Teilwort test enthalten; _ digit* 17 alle Wörter, die mit _ anfangen, dann eine beliebige Folge von Ziffern aufweisen, die mit 17 aufhört; exp ::= (e E)(+ -)? digit digit* float ::= digit digit* exp digit* (digit.. digit) digit* exp? alle Gleitkomma-Zahlen... 24

Identifizierung von reservierten Wörtern, Namen, Konstanten Ignorierung von White Space, Kommentaren... erfolgt in einer ersten Phase ( Scanner) == Input wird mit regulären Ausdrücken verglichen und dabei in Wörter ( Tokens ) aufgeteilt. In einer zweiten Phase wird die Struktur des Programms analysiert ( Parser). 25

1.4 Struktur von Programmen Programme sind hierarchisch aus Komponenten aufgebaut. Für jede Komponente geben wir Regeln an, wie sie aus anderen Komponenten zusammengesetzt sein können. program :: = decl* stmt* decl :: = type name (, name )* ; type :: = int Ein Programm besteht aus einer Folge von Deklarationen, gefolgt von einer Folge von Statements. Eine Deklaration gibt den Typ an, hier: int, gefolgt von einer Komma-separierten Liste von Variablen-Namen. 26

1.4 Struktur von Programmen Programme sind hierarchisch aus Komponenten aufgebaut. Für jede Komponente geben wir Regeln an, wie sie aus anderen Komponenten zusammengesetzt sein können. program :: = decl* stmt* decl :: = type name (, name )* ; type :: = int Ein Programm besteht aus einer Folge von Deklarationen, gefolgt von einer Folge von Statements. Eine Deklaration gibt den Typ an, hier: int, gefolgt von einer Komma-separierten Liste von Variablen-Namen. 27

stmt :: = ; { stmt* } name = expr; name = read(); write( expr ); if ( cond ) stmt if ( cond ) stmt else stmt while ( cond ) stmt Ein Statement ist entweder leer (d.h. gleich ;) oder eine geklammerte Folge von Statements; oder eine Zuweisung, eine Lese- oder Schreib-Operation; eine (einseitige oder zweiseitige) bedingte Verzweigung; oder eine Schleife. 28

expr :: = number name ( expr ) unop expr expr binop expr unop :: = - binop :: = - + * / % Ein Ausdruck ist ein Literal, eine Variable oder ein geklammerter Ausdruck oder ein unärer Operator, angewandt auf einen Ausdruck, oder ein binärer Operator, angewand auf zwei Argument-Ausdrücke. Einziger unärer Operator ist (bisher) die Negation. Mögliche binäre Operatoren sind Addition, Subtraktion, Multiplikation, (ganz-zahlige) Division und Modulo. 29

cond :: = true false ( cond ) expr comp expr bunop cond cond bbinop cond comp :: = ==!= <= < >= > bunop :: =! bbinop :: = && Bedingungen unterscheiden sich dadurch von Ausdrücken, dass ihr Wert nicht vom Typ int ist sondern true oder false (ein Wahrheitswert vom Typ boolean). Bedingungen sind darum Konstanten, Vergleiche oder logische Verknüpfungen anderer Bedingungen. 30

1.5 Syntax-Bäume int x; x = read(); if (x > 0) write(1); else write(0); Die hierarchische Untergliederung von Programm-Bestandteilen veranschaulichen wir durch Syntax-Bäume: 31

Syntax-Bäume für x > 0 sowie write(0); und write(1); cond stmt stmt expr expr expr expr name comp number number number x > 0 write ( 1 ) ; write ( 0 ) ; Blätter: innere Knoten: Wörter/Tokens Namen von Programm-Bestandteilen 32

program stmt cond stmt stmt decl stmt expr expr expr expr type name name name comp number number number int x ; x = read ( ) ; if ( x > 0 ) write ( 1 ) ; else write ( 0 ) ; 33

Bemerkungen: Ein Syntaxbaum bezeichnet eine baumförmige Darstellung einer Ableitung, also eine Folge von Ersetzungsschritten auf Symbolen. Die Ersetzungsschritte sind anhand einer formalen Grammatik definiert. Die Folge von Ableitungsschritten erzeugt ein Wort einer formalen Sprache. 34

Bemerkungen: Die vorgestellte Methode der Beschreibung von Syntax heißt EBNF-Notation (Extended Backus Naur Form Notation). Ein anderer Name dafür ist erweiterte kontextfreie Grammatik Nichtterminalsymbole können ohne Berücksichtigung ihrer benachbarten Symbole durch Ausdrücke ersetzt werden. Linke Seiten von Regeln sind die Nicht-Terminale Begriffe, die durch BNF-Regeln erklärt werden. 35

Bemerkungen: Die BNF (Backus-Naur-Form),benannt nach John Backus und Peter Naur, wurde erstmals zur Beschreibung der Syntax von Algol 60 verwendet. Heute ist die BNF (in notationellen Varianten) die Standardbeschreibungstechnik für Programmiersprachen. Auch die Syntax von Java wird in der Backus-Naur-Form beschrieben. 36

Noam Chomsky, MIT John Backus, IBM Turing Award (Erfinder von Fortran) Peter Naur, Turing Award (Erfinder von Algol60) 37

Achtung: Die regulären Ausdrücke auf den rechten Regelseiten können sowohl Terminale wie Nicht-Terminale enthalten. Deshalb sind kontextfreie Grammatiken mächtiger als reguläre Ausdrücke. Beispiel: L = {ϵ, ab, aabb, aaabbb,...} lässt sich mithilfe einer Grammatik beschreiben: A :: = ( a A b )? 38

Syntax-Baum für das Wort aaabbb : A A A A a a a b b b Für L gibt es aber keinen regulären Ausdruck!!! ( Automatentheorie) 39

Weiteres Beispiel: L = alle Worte mit gleich vielen a s und b s Zugehörige Grammatik: S :: = ( b A a B )* A :: = ( b A A a ) B :: = ( a B B b ) 40

Syntax-Baum für das Wort aababbba : S B B A B B B a a b a b b b a 41