Java für Anfänger Teil 2: Java-Syntax Programmierkurs 06.-10.10.2008 Manfred Jackel 1 Syntax für die Sprache Java public class Welcome { } Schlüsselworte Reservierte Worte Keywords Wortsymbol Syntax: griech. Zusammenstellung Lehre vom Satzbau (wie Wörter zu Phrasen (Teilsätzen) und Sätzen zusammen gefügt werden Griechisch: gramma, das Geschriebene, Buchstabe Lateinisch: ars grammatica Kunst des Lesens und Schreibens Linguistisch: Grammatik, systematische Sprachbeschreibung Informatisch: Grammatik als formale Sprachbeschreibung, endliche Viele Regeln Zeichensymbole public class Welcome { } Schlüsselworte Reservierte Worte Keywords Wortsymbol Zeichensymbol Reservierte Worte in Java abstract try boolean void break else byte extends case final catch finally char float class for const goto continue default transient do import public double instanceof int interface long native new null package if implements short volatile static while super switch synchronized this throw private throws protected return 4 Bezeichner public class Welcome { } Schlüsselworte Bezeichner Zeichensymbol Reservierte Worte Name Keywords Wortsymbol Regeln für die Bildung von Bezeichnern in Java 1. Das Zeichen muss ein Buchstabe sein 2. Dahinter wahlweise eine beliebig lange Folge aus Buchstaben oder Ziffern 3. _ Unterstrich und $ sind Buchstaben, sollen vermieden werden. 4. Groß- Kleinschreibung wird unterschieden Bezeichner public class Welcome { } Richtig: N n N1 quadratWurzel A_1 Schlüsselworte Bezeichner Zeichensymbol Reservierte Worte Name Keywords Wortsymbol Regeln für die Bildung von Bezeichnern in Java 1. Zeichen muss ein Buchstabe sein 2. Dahinter wahlweise eine beliebig lange Folge aus Buchstaben oder Ziffern 3. _ Unterstrich und $ sind Buchstaben, sollen vermieden werden. 4. Groß- Kleinschreibung wird unterschieden Falsch: Bezeichner public class Welcome { } Schlüsselworte Bezeichner Zeichensymbol Reservierte Worte Name Keywords Wortsymbol Regeln für die Bildung von Bezeichnern in Java 1. Zeichen muss ein Buchstabe sein 2. Dahinter wahlweise eine beliebig lange Folge aus Buchstaben oder Ziffern 3. _ Unterstrich und $ sind Buchstaben, sollen vermieden werden. 4. Groß- Kleinschreibung wird unterschieden 1 1a else Backus-Naur-Form BNF Eine einfache und effektive Methode, Syntaxregeln exakt zu notieren Erfunden von John Backus und Peter Naur im Zusammenhang mit Algol 60 John Warner Backus, 1924-2007, ab 1959 bei IBM, Mitentwickler von Fortran (die erste höhere Programmiersprache, 3GL), ab 1959 BNF Peter Naur, geb. 1928, Dänemark, Mitentwickler von Algol 60 8 Formale Sprachen Informatik benutzt formale Sprachen Eine formale Sprache besteht aus Worten über einem endlichen Alphabet von Zeichen. In der Informatik nur Sprachen interessant, die durch (einfach zu handhabende) Grammatiken erzeugt werden können. EBNF ist eine einfache und doch „mächtige“ Grammatik John Backus 1924, Fortran & FP, Peter Naur 1928 9 Definition EBNF (N,T,P,S) N = endliche Menge von Nonterminals Nonterminals sind Grammatikbegriffe T = endliche Menge Terminalsymbole (Zeichen) Die durch EBNF definierte Sprache besteht aus aneinandergereihten Terminalsymbolen (Worte aus den Terminalzeichen) P = endliche Menge von Produktionen der Form A ::= EBNF-Ausdruck A∈N ist Nonterminal EBNF-Ausdruck besteht aus Nonterminals, Terminals und Meta-Zeichen {}[]()| Ein Startsymbol S∈N Die definierte Sprache besteht aus allen Worten aus Zeichen aus T, die mit Regeln aus P aus dem Startsymbol hergeleitet werdeb können. 10 EBNF-Ausdrücke Aneinanderreihung A ::= BCD A wird durch die 3 aufeinaderfolgenden Symbole ersetzt | Alternative A ::= B | C | D A kann durch B oder C oder D ersetzt werden [] Option A ::= [B]C A kann durch BC oder C ersetzt werden. {} Wiederholung A ::= {B}C A kann durch C, BC, BBC, B….BC ersetzt werden. 11 Syntax für Bezeichner Regel, Backus-Naur-Notation (Metasprache) Definition LETTER ::= ‘a’|’b’| …|'c'|'A'|'B'|…'Z' DIGIT ::= '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' Identifiername ::= LETTER Identifiername ::= Identifiername LETTER Identifiername ::= Identifiername DIGIT Identifier ::= Identifiername aber kein reserviertes Wort N={LETTER,DIGIT,Identifiername,Identifier} T={'A'..'Z','a'..'z','0'..'9','_','$'} Syntax für BezeichnerVariable Nonterminal Backus-Naur-Notation (Metasprache) wird definiert durch LETTER ::= „a'|'b'| …|'c'|'A'|'B'|…'Z' oder, DIGIT ::= '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' alternativ Identifiername ::= LETTER Identifiername ::= Identifiername LETTER Identifiername ::= Identifiername DIGIT Identifiername ::= Identifiername LETTER Identifier ::= Identifiername aber kein reserviertes Wort Beispiel: H2O Identifiername ::= Identifiername LETTER Identifiername ::= Identifiername 'O' DIGIT ::= …|'2'|… anwenden Identifiername ::= Identifiername '2O' Identifiername ::= Identifiername DIGIT anwenden Identifiername ::= Identifiername DIGIT 'O' LETTER ::= …|'O'|… anwenden Identifiername ::= LETTER anwenden Identifiername ::= LETTER '2O' LETTER ::= …|'H'|… anwenden Identifiername ::= 'H2O' „H2O' lässt sich aus dem Nonterminal Identifiername ableiten und ist kein reserviertes Wort, ist also ein gültiger Bezeichner in Java EBNF-Beispiel Zahl-Literale in Java durch EBNF definieren Menge der Nonterminals N = {IntegerLiteral, OctalLiteral, DeciLiteral, HexLiteral,Digit, Digit1, OctDigit, HexDigit} Menge der Terminalsymbole T={‘0‘,‘1‘,‘2,‘3,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘a‘,‘b‘,‘c,‘d‘,‘e‘,‘f‘,‘l,‘‘x‘,‘A‘,‘ B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘L‘,‘X‘,‘.‘,‘+‘,‘-‘} Startsymbol: IntegerLiteral 15 Extended Backus Naur Form DIGIT::= '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' DIGIT1::= '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' DeciLiteral::= DIGIT1 { DIGIT } | '0' Was in geschweiften Klammen steht, darf beliebig oft wiederholt werden! Auch 0 mal! Literale für Dezimalzahlen DIGIT::= '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' DIGIT1::= '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' DeciLiteral::= DIGIT1 { DIGIT } | '0' Eine Java-DezimalZahl ungleich Null darf nicht mit der Ziffer „0' beginnen! 02 ist KEIN dezimales Literal, 20 schon Literale für Oktalzahlen OCTDIGIT::= '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7' OctalLiteral::= '0' OCTDIGIT { OCTDIGIT } 02 ist ein oktales Literal, 20 nicht 010 == 8 !!! 08 ist falsch! Eine führende Null bedeutet;. Oktalzahl! Ableiten der Dezimalzahl 10 IntegerLiteral ::= DeciLiteral DeciLiteral ::= Digit1{Digit} ‘1‘Digit ‘1‘‘0‘ Ableiten der Oktalzahl 077 = 63 IntegerLiteral ::= OctLiteral OctLiteral ::=‘0‘ OctDigit{OctDigit} ‘0‘ ‘7‘{OctDigit} ‘0‘ ‘7‘OctDigit ‘0‘ ‘7‘ ‘7‘ 19 Literale für Hexadezimalzahlen HEXDIGIT::= < Digits 0 to 9, Letters A to F, Letters a to f > HexLiteral::= ('0x' | '0X' ) HEXDIGIT { HEXDIGIT } 0x10 == 16 !!! 0xa == 0Xa == 0XA == 10 == 012 Literale für ganze Zahlen IntegerLiteral::= DeciLiteral | OctalLiteral | HexLiteral ) [ 'l' | 'L' ] Java kennt Oktal-, Dezimal- und Hexedezimalzahlen. L oder L am Ende heißt long = 8 ByteWas in eckigen Speicherplatz Klammen steht, ist optional. Java kennt ganzzahlige darf einmal Datentypen mit 1, 2, 4 oder 8 Byte Es oder keinmal Speicherplatz, vorkommen! Was wird ausgegeben? System.out.print(017) System.out.print(0x17) System.out.print(“0x17“) System.out.print(017+0x17+17) System.out.print(“0x17“+017+17) Was wird ausgegeben? System.out.print(017) 15 System.out.print(0x17) 23 System.out.print(“0x17“) 0x17 System.out.print(017+0x17+17) 55 System.out.print(“0x17“+017+17) 0x171517 Syntaxregel für „public class …“ Vererbung, später ClassDeclaration::= { ClassModifier } 'class' Identifier [ 'extends' TypeName ] [ 'implements' TypeName { ',' TypeName } ] ( ClassBody | ';' ) Information hiding ClassModifier::= 'public' | 'protected' | 'private' | 'abstract' | 'static' | 'final' | 'strictfp' ClassBody::= '{' { ClassBodyDeclaration } '}' Java-Syntax ClassModifier Identifier public class Welcome { } Komplette Syntax http://iis.unikoblenz.de/Javakurs2007/Kursmaterial/mysynta x.htm