EBNF (Erweiterte Backus-Naur-Form) Hart und Trocken https://www.youtube.com/watch?v=MPuFUk0diDc Transkript (automatisch erstellt) 0:03 [Musik] willkommen bei hart und trocken wir sprechen über die bacchus neuer form wir beschäftigen uns damit wie ich die 0:16 syntax einer programmiersprache beschreiben kann das heißt wie kann ich die korrekt geformten setzte in einer 0:23 programmiersprache beschreiben die syntax an der sprache ist genau dieses regelsystem was mir sagt was ich so genannten wohlgeformten sätze sind und 0:33 welche sätze nicht wohl geformt sind ein berühmtes beispiel dafür ist der satz farblos grüne ideen schlafen wütend der satz ist komplett unsinnig er ist 0:44 aber wohl geformt grammatikalisch ist der satz in ordnung farblos grüne ideen schlafen wütend was ich gerne möchte ist ein regelsystem für eine 0:54 programmiersprache was mir wie zb im deutsche sagt dieser satz ist wohl geformt oder dieser ausdruck in der programmiersprache ist wohl geformt die 1:05 syntax von programmiersprachen ist vergleichsweise einfach natürliche sprachen sind viel schwerer zu beschreiben und weil programmiersprachen 1:12 einfach zu beschreiben sind gibt es dafür auch eine vergleichsweise einfache form wir werden die so genannte erweiterte bacchus neuer form verwenden 1:21 um zumindest einen teil der syntax von python zu beschreiben in der emf gibt es vier verschiedene wichtige bestandteile das erste sind die 1:32 terminalen symbole dabei handelt es sich um zeichen oder auch zeichenketten die unterstrichen sind 1:39 diese symbole heißen terminale symbole weil sie nicht mehr durch irgendetwas anderes ersetzt werden die nicht terminalen symbole sind zeichen oder 1:49 zeichenketten die wir in spitze klammern schreiben zum beispiel hier nix oder zahl oder ausdrucke diese zeichen oder zeichenketten in spitzen klammern werden 2:01 durch die regeln ersetzt in andere entweder nicht terminale symbole oder terminale symbole dann gibt es ein sogenanntes leeres 2:12 zeichen dieses y in spitze klammern weil wir manchmal ein nicht terminale symbol einfach durch nichts ersetzen wollen dafür ist dieses zeichen speziell 2:22 gedacht und dann gibt es regelt zeichen zum beispiel die zuweisung mit zwei doppel punkten und dem gleichheitszeichen es gibt ein roter 2:32 zeichen dann geschäfte klammern davon auch eine variante mit einem pluszeichen eckige klammern und das sind jetzt in der bnf spezielle symbole mit denen wir 2:43 die regeln definieren ein kleines beispiel macht klar wie die ebm es funktioniert ich habe eine regel für das nicht terminale symbolik six in 2:55 spitze klammern und diese six kann ersetzt werden durch ein unterstrichen es klein ist also wirklich den buchstaben kley nix dann 3:04 wieder das nicht terminale symbol und dann den buchstaben kleine y wenn ich hier eine zeichenkette habe dann kann ich an diese zeichenkette 3:14 vorne und hinten an y hängen ich kann ein vorkommen von iks in spitzen klammern aber auch durch das leere symbol ersetzen einfach durch nichts 3:25 ersetzen mit diesen regeln kann ich jetzt zeichenketten erzeugen ich starte mit dem nicht terminalen symbol und als 3:31 erste regel wenn dich an ich hänge vorne einig sun und hinten an y dann wenn sich die regeln noch mal an und hänge wieder vorne nix und hinten 3:43 ein y an und das mache ich mehrmals ich hänge jeweils vorne eins hinten eins y an bis ich irgendwann wenn ich einmal iks bzw y 3:54 erarbeitet habe sage jetzt verwende ich die zweite regel und ersetze das nicht terminale symbolisch durch das leere symbol das heißt ich komme ich hier bei 4:06 der zeichenkette xxx in x y y y wenn mal an in der emf gibt es mal kurz schreibweisen die es leichter machen die 4:16 syntax eine programmiersprache zu beschreiben das erste ist dass oder der senkrechte strich bedeutet das entweder die linke oder die rechte seite von dem 4:25 senkrechten strich angewendet werden kann hier kann ich sagen dass nichts terminale symbol grosics kann ersetzt 4:33 werden durch klein xx klein y oder durch das leeres wohl diese eine regel sagt das gleiche aus wie die regel auf der vorherigen seite dann gibt es die option 4:46 das sind eckige klammern vor und nach einem ausdruck das bedeutet dass das was in der eckigen klammern steht stehen kann oder nicht ich kann entweder 4:59 ersetzen durch b oder durch y also durch nichts mit anderen worten wird entweder durch b ersetzt oder es wird durch exelon ersetzt die nächste 5:14 kurz schreibweise ist die wiederholung für ein größer gleich null wenn ich den ausdruck b in spitzen klammern in eckige klammern setzte dann 5:25 bedeutet das ich kann dieses b mehrmals wiederholen wobei mehrmals bedeutet entweder keinmal oder einmal oder zweimal dreimal viermal fünfmal und so 5:35 weiter ich kann also entweder 0 x b verwenden das wäre diese situation oder ich verwende einmal b und habe dann aber immer noch hier den ausdruck a stehen 5:46 das heißt ich kann die regeln noch mal anwenden um noch mal ein baby zu erzeugen und nochmal ein b und nochmal ein b manchmal möchte ich ausdrücken 5:53 dass etwas wiederholt werden soll so oft wie ich möchte das ist aber mindestens einmal stehen muss das ist die wiederholung mit n 6:01 größer gleich eins die funktioniert ganz analog zur wiederholung für n größer gleich null mit dem unterschied dass ich jetzt hier 6:08 noch ein plus an die geschäfte klammer anhänge der unterschied zur regel gerade eben ist dass ich jetzt hier nachdem oder zeichen nicht mehr das 6:18 leere symbol habe sondern ich habe ein b das heißt ich kann entweder durch b ersetzen oder durch abi und dann könnte ich hier das wiederum durch abe ersetzen 6:30 noch mal durch a b und so kann ich eine lange reihe von b erzeugen mit dieser emf können wir jetzt eine syntax beschreibung des teils von 6:40 preisen machen den wir schon kennen gelernt haben wir lassen dabei dass prinz statement aus und es gibt auch ein paar feinheiten 6:47 die sich nur etwas umständlich beschreiben lassen würden die wir ebenfalls weglassen die wichtigen bestandteile aber können wir hier 6:53 beschreiben wir beginnen mit der zahl eine zahl hier als nicht terminale symbol besteht aus hier einem optionalen teil und da steht 7:02 entweder hier durch die senkrechte linie angezeichnet ein plus oder ein minus die unterstreichung macht klar dass wirklich ein plus als zeichen oder ein - als 7:11 zeichen stehen soll dann folgt in geschäften klammern mit einem plus das heißt mindestens einmal wiederholt das nicht terminale symbol 7:20 ziffer die ids an die zahl ist eine ziffernfolge hier beliebiger länge aber mindestens eine kiefer muss es sein und wir können ein plus oder minus davor 7:31 schreiben ich habe jetzt hier darauf verzichtet ziffer auszuschreiben ziffer würde man definieren als null oder eins oder zwei oder und so weiter als 7:43 nächstes folgte ausdruck ein ausdruck kann aus relativ unterschiedlichen dingen bestehen zum einen kann ein ausdruck einfach eine zahl sein so wie 7:53 gerade eben definiert dann ein minuszeichen und ein bezeichne den wir gleich hier unten definieren werden dann eine runde klammer und dann ausdruck 8:03 operator ausdruck und wieder eine schließende klammer damit möchten wir ausdruck plus ausdruck oder ausdruck - ausdruck schreiben können hiermit 8:14 möchten wir zum beispiel xx schreiben können oder x-mal ich's dann kann eine ausdruck folgendes sein ein bezeichne runde klammer auf und dann optional 8:28 dieser teil hier er besteht aus einmal ausdruck und dann hier mit geschäften klammern das heißt 0 x oder einmal oder zweimal und so weiter 8:40 weitere ausdrücke das heißt ich kann mit dieser darstellungsweise beschreiben dass ich eine funktion aufrufen kann 8:49 und diese funktion kann beliebig viele argumente haben zum schluss kann ein ausdruck auch ein bedingter ausdruck sein ein conditioner 9:00 der bezeichnung den wir hier und hier gesehen haben wird definiert als ein buchstabe und dann beliebig oft wiederholt buchstaben oder zahlen 9:10 das heißt ein bezeichnen kann etwas sein wie a11 bcc oder quadrat oder quadrat 2 was nicht erlaubt ist als bezeichnet ist 2x weil dieser bezeichnung mit einer 9:24 zahl an fängt er muss aber mit einem buchstaben anfangen dann müssen wir noch wissen was ist mit diesen operatoren auf sich hat das sind einfach die 9:32 grundrechenarten plus minus x und geteilt ich möchte also ausdruck mal ausdruck schreiben können in unserer mini version von preis nun 9:42 haben wir auch funktionen verwendet eine funktion wird so definiert ich habe zunächst das schlüsselwort das was ich genau so hinschreiben muss dann kommt 9:53 der name der funktion wir müssen uns gleich noch überlegen wie so ein name aussehen darf dann geht eine klammer auf es kommen die formalen parameter 10:01 vielleicht wollen wir nix übergeben wie zb bei der quadrat funktion vielleicht wollen wir auch zwei argumente übergeben vielleicht wollen wir auch kein argument 10:08 übergeben dann schließen wir mit der klammer und schreiben einen doppelpunkt was dann folgt ist der funktions rumpf der bei 10:16 uns im moment sehr einfach aussieht ich habe genau vier leerzeichen und dann kommt das was wir hier funktionsraum nennen was er gleich noch definieren der 10:26 name der funktion soll ein bezeichnet sein so wie wir ihn gerade definiert haben das heißt fängt an mit einem buchstaben und dann können zahlen oder 10:34 buchstaben kommen die liste der formalen parametern verwendet wieder den trick von vorher optional kann folgendes kommen das heißt 10:43 es kann auch leer bleiben einnahme und dann eine beliebige folge von comma name komma name komma name und so weiter der funktions rumpf sieht bei uns jetzt 10:54 immer so aus wir haben hier das schlüsselwort return was er genau so schreiben müssen und dann kann nach dem return 11:00 ein ausdruck folgen außerdem gibt es noch die bedingten ausdrücke in unserer sprache dieses conditional sieht so aus ausdruck schlüsselwort ein bursche 11:12 ausdruck als ausdruck die bedeutung war wenn das hier war ist wird er als das hier aus wir haben dass sie immer im funktions rund verwendet liefere das 11:22 zurück wenn dieser bursche ausdruck falsch ist dann wertet das hier aus der bursche ausdruck hier ist so definiert entweder das schlüsselwort true oder das 11:36 schlüsselwort falls dies in den beiden vordefiniert dann klammer auf und hier in klammer zu ein ausdruck ein vergleich operator und ein ausdruck oder ich habe 11:49 in runden klammern einen burschen ausdruck ein logischer operator und nochmal im bullishen ausdruck wir sehen jetzt schon das ergebnis von einem 11:58 solchen burschen aus druck ist immer da oder forst und wir arbeiten dabei entweder direkt mit burschen ausdrücken auch hier das hier ist etwas was wahr 12:09 oder falsch ist das hier ist etwas was wahr oder falsch ist und das kombiniert mit dem logischen operator mit und oder oder oder ich habe einen burschen 12:18 ausdruck in runden klammern und schreibe ein ausrufezeichen davor das ist die negation wenn das hier war ist dann ist das hier falsch und umgekehrt 12:30 die vergleichs operatoren sind test auf gleichheit ungleichheit kleiner größer kleiner gleich größer gleich an dieser stelle wichtig der test auf gleichheit 12:44 wird mit zwei gleichheitszeichen geschrieben und das einfache gleichheitszeichen bedeutet immer eine zuweisung die logischen operatoren sind 12:55 und und oder zum schluss wie sieht ein mini preisen programm aus das programm besteht aus einem ausdruck und dann einen zeilenumbruch und das ganze 13:07 mindestens einmal ausdrücke sollen immer in einer neuen separaten zeile stehen um hier vielleicht noch mal zu zeigen was möglich ist mit diesen 13:18 bedingten ausdrücken wir betrachten eine funktion namens f die drei argumente bekommt xyz und jetzt könnte zum beispiel sollen bedingte 13:30 ausdruck der in dem return statement auftaucht so aussehen diese funktion liefert folgendes zurück wenn nix größer als y ist und y gleich 13:44 ist wie z aus den gleichen wert bz hat dann liefere iks + y und sonst also wenn all das hier nicht gilt liefere z mit leerzeichen müssen wir ein bisschen 13:59 aufpassen in python was wir damit meine sind zum einen ganz normale leerzeichen aber auch zeilenumbrüche oder tabulaturen im englischen sagt noch für 14:08 all das zusammen white space in bezeichnen zahlen oder schlüsselwörtern darf ich keinen white space haben das heißt wenn ich eine variable 14:16 bezeichnen möchte die quartieren und dann 1 abziehen heißt dann darf ich darin keinen white space unterbringen wenn bezeichne zahlen oder 14:25 schlüsselwörter aufeinander folgen dann muss mindestens ein leerzeichen dazwischen stehen das heißt dieser ausdruck hier ist nicht korrekt weil ich 14:34 an diesen stellen hier ein leerzeichen unterbringen es heute oder mindestens ein leerzeichen das heißt ich könnte hier oder hier auch mehrere leerzeichen 14:45 unterbringen das ist unproblematisch es muss aber mindestens eins sein mit hilfe der emf kann ich jetzt kontext freisprachen definieren diese kontext 14:55 freien sprachen zeichnen sich eben dadurch aus dass sie keinen kontext benötigen es sind einfache regeln mit denen ich entscheiden kann ob ein satz 15:05 oder ein ausdruck grammatikalisch korrekt ist ich muss aber nicht wissen über was gesprochen wird mit anderen worten ich 15:14 kann ein python programm schreiben was eine völlig unsinnige berechnungen anstellt ich kann aber sagen die syntax des programms ist korrekt 15:23 die kontext freien sprachen habe einen großen vorteil ich kann dafür eine maschine bauen oder ich kann ein programm wiederum schreiben was in 15:32 endlicher zeit entscheiden kann ob ein bestimmtes wort in der sprache enthalten ist oder nicht ich kann ein programm schreiben was 15:40 entscheidet ob ein programm sind taktisch korrekt ist oder nicht solche kontext freien sprachen sind sagt man entscheid war noch ein sprach mittel was 15:51 ich jetzt in der emf nicht untergebracht habe was aber sehr wichtig ist das sind kommentare ich kann in python programme hinweise einbauen an menschliche leser 16:00 diese kommentare werden in der programmausführung ignoriert für die maschine für den rechner sind sie völlig irrelevant für menschliche leser sind 16:09 sie aber sehr wichtig programme richtig zu kommentieren ein wichtiger bestandteil der programmierung kommentare in python 16:17 beginnen mit einem gatter oder resch und alles was in dieser zeile nachkommt wird ignoriert hier in dem kleinen beispiel programm 16:27 ist es so der erste kommentar fängt direkt hier an der nächste wiederum hier in der zeile kommt noch mal so einen hash vor 16:35 das bedeutet aber nicht dass danach das ganze aufgelöst wird oder so was dass der kommentar in dieser stelle ist der ganze rest der zeile einfach einen 16:44 kommentar hier ist ein kommentar über die folgende funktion fk funktion etwa berechnet das quadrat von +1 hier in klammern geschrieben damit klar ist dass 16:57 man das quadrat von ausrechnet und dann +1 und nicht bloss 1 und dann das quadrat und dann folgen noch mal 2 kommentare die erst ein bisschen später 17:05 beginnen in der zeile und aber für den rest der zahlen gelten zum einen die funktion heißt es von a und dann die funktion gibt aber mal +1 zurück die 17:15 beiden letzten kommentare hier sind beispiele für kommentare wie man sie nicht machen sollte da wird nur das offensichtliche 17:22 kommentiert ich sollte in den kommentaren nicht beschreiben was man sowieso direkt sieht nämlich hier da gibt es ein return und a mal a plus 17:31 eins das sehe ich sofort was da passiert kommentare sind dann gut wenn sie ein bisschen was über die idee des programms erläutern 17:38 das programm hier ist zu kurz um etwas tiefgründiges zu sagen aber einen kommentar zu einer funktion ist dann gut wenn gesagt wird wofür die funktion da 17:47 ist wofür man sie anwenden kann wofür vielleicht auch nicht warum sie so gebaut wurde was sie für besonderheiten hat für welche argumente man sie nicht 17:55 verwenden darf und so weiter richtig kommentieren ist eine aufwändige sache aber wenn ich im programm schreibe das irgendwann weg lege und dann nach 18:05 einem jahr wieder drauf dann ist die gefahr groß dass sich das programm nicht mehr verstehe wenn ich keine kommentare reinschreiben 18:12 deswegen ist das kommentieren sehr wichtig nicht nur damit andere das programm vielleicht lesen können sondern damit man es auch selbst noch versteht 18:20 das war hart und trocken bmf [Musik]