/media/sda-magnetic/david/Dokumente-15/fernuni-hagen/cs-i-ii/old-cs-2-03/pascal-compiler/sqrparse-2020-02-22/sqrparse.txt


Dann das nächste Thema: Verschachtelung und Rekursion. Das Thema ist eigentlich Kettenreaktion. Den Text, den ich jetzt poste, poste ich getrennt im nächsten Beitrag. Rekursion, Kettenreaktion und Nähkästchen. Das ist interessant. 
Ich plaudere ja gerade auch eines aus dem Nähkästchen. Wissen Sie, ich war mit dem VSP an einer Außenakitivität. Und dabei waren wir in Schloss Lichtenstein. Und da war auch ein Nähkästchen. Und darauf hat die Führerin eindeutig hingewiesen, dass das ein beliebtes Nähkästchen war.  
Und solche Nähkästchen zeichnen sich daraus hervor, dass sie besonders in jedem Kästchen wieder ein Kästchen haben und davon besonders viele, und unterschiedliche große und so weiter. 
Und das ist eigentlich ein Prinzip, das passt perfekt zu dem Wort Box. Und, wenn wir uns so eine Box vorstellen, so von der Post, dann könnten wir uns vorstellen, da hätte jemand viele kleinen Boxen, Pakete untergebracht und die reihen aneinander, sind aber unterschiedlich groß und da wieder beliebig viele drin und so weiter. 
Das ist ein Prinzip, das kennt man bei der Programmierung. Das ist letzten Endes die Schachtelung. Aber die Schachtelung und Rekursion, das ist eigentlich dasselbe. Eine Rekursion, stellts ich in der Programmiersprache so dar:

func() {
;;;;func();
return;
}

Beim Compiler zeigt sich das besonders prägnant. Weil, wenn wir eine Programmiersprache anschauen, dann haben wir es mit Schachtelungen zu tun, und die sehen, wie folgt aus:

BEGIN
;;;BEGIN
;;;END 
END 

Und das sind die Schachtelungen bei einer Programmiersprache. Und womit übersetzt man eine Programmiersprache? Genau, mit einem Übersetzer, Compiler. Und dabei ist interessant: Der Compiler ist etwas, das absolut auf Rekursion aufbaut. Compiler, das ist etwas, das mit Rekursionen zusammenhängt. Kein Compiler ohne Rekursion. 
Dabei sind es diese Schachtelungen, der Programmiersprachen, die den Compiler, rekursiv beschäftigen. Also hier hängen Rekursion und Schachtelung in der Quelltext der Programmiersprache, der als Eingabedaten zur Verfügung steht, ganz stark zusammen. In diesem Falle: Schachtelung ^= Rekursion. 
Etwas ist besonders, an diesem Thema, nämlich:

Diese Schachtelungen steuern quasi die Rekursion. Zunächst in Mal müssen wir bei Rekursionen unterscheiden: 
1. Wir rufen in der Funktion, die Funktion selber immer wieder auf:

func() {
;;;;func();
return;
}

2. Wir rufen in der Funktion, die Funktion selber mehrfach auf:

func() {
;;;;func();
;;;;func();
return;
}

3. Wir lassen verschiedene Funktionen, sich gegenseitig auch mehrfach aufrufen:

func1() {
;;;;func2();
;;;;func1();
return;
}

func2() {
;;;;func2();
;;;;func1();
return;
}

Besonders ist noch, wenn wir mit IF-THEN-ELSE ankommen, d.h. wenn wir noch eine Entscheidung voranstellen, ob wir eine Funktion überhaupt aufrufen.
Eigentlich ließe sich für solche Paketboxen oder Nähkästchen, wie oben beschrieben, genau das verwenden: Ein Compiler. Weil wir haben, bei der Programmiersprache Schachtelungen. Das haben wir bei Schachteln auch - also bitte: Compiler her.

Mathematisch wäre das interessant: Weil in einer Programmiersprache, können wir geschachtelt, in einer Schachtelung eine kleine Funktion, eine große aufrufen. Aber in einem kleinen Paket, steckt kein größeres Paket. Bitte, wir sind doch gute Mathematiker würden wir sagen: Wir sprengen die Grenzen der Geometrie. Die Euklidische Geometrie lehrt uns, dass es Kugeln, Sterne, Kreise sonst was gibt. Das lehrt die euklidische Geometrie. Nach unserem Verständnis, steckt in einer großen Kugel, vielleicht eine kleine. Aber wir könnten an unseren Mengen arbeiten, anstatt, dass wir Euklid leugnen gibt es immer noch Kugeln, aber wir erlauben jetzt mathemtisch, wir stecken eine große Kugel in eine kleine. So machen wir das auch mit unseren Pakten. Ab jetzt können wir große Pakete in kleine stecken. 

Umgekehrt beim Programmieren ist es nicht anders. Wenn wir etwas schreiben wieder

BEGIN
;;;BEGIN 
;;;END  
END 

Dann steckt automtisch der kleine Teil im großen. 

Dieses Prinzip der Schachtelung begegnet uns immer wieder, häufiger, als wir denken. Und ich sehe hier einen ursprünglichen Wunsch in uns, eine ursprüngliche Idee. Das zeigt sich öfter, als wir denken. Wir erleben es zum Beispiel in der Bibel, wo Adam und Eva ein Kind zeugen und dann kommt wieder ein Kind. Dieses Prinzip, ist eher das einer Kettenreaktion. Doch ich behaupte, Kettenreaktion und Schachtelung, bzw. Rekursion, hängen ganz stark zusammen.

Zum Beispiel bei einer nuklearen Kettenreaktion. Eigentlich ist das eine Rekursion. Das erste Teilchen, was gespalte wird oder fusioniert, erzeugt neue. Und damit hätten wir eine Rekursion, der Form 

func() {
;;;func();
return;
}

Umgekehrt: Was bei der Kettenreaktion anders ist, ist, dass sie sich zum Beispiel exponentiell vermehrt: Also

func() {
;;;func();
;;;func();
return;
}

Wir könnten das auch ins unermessliche treiben, indem wir schreiben

func() {
int i;
for(i = 0; i < 100; i++)
;;;func();
return;
}

Jetzt wir die Funktion 100 Mal in sich aufgerufen. Umgekehrt: Wenn wir Adam und Eva anschauen, haben wir wieder zwei passende Beispiele. Ja, die russische Puppe, fragen sie mich nicht, wie die heißt, ich sage garantiert das falsche, aber wir haben zu Hause zwei solcher, und da steckt eine Puppe in der anderen. Und das ist im wahrsten Sinne des Worten (a) eine Rekursion (b) das, was Adam und Eva ist (c) eine Paketbox. Umgekehrt: Hier, bei dieser Puppe, finden wir das typische Kriterium, für eine Rekursionsabbruchbedigung. Nämlich die kleinste Puppe, aus der man keine Puppe mehr holt. 

Das ist, was manchmal eine Rekursion schwer macht, wann bricht eine Rekursion ab? 

Umgekehrt: Es gibt noch ein Beispiel: Die Elektromagnetische Welle. Hier entsteht B- aus E-Feld und E- aus B-Feld und so weiter. Das wird beschrieben durch Maxwell und ist darin begründet, dass ein Stromdurchflossener Leiter immer von einem B-Feld umgeben ist und ein bewegtes, sich änderndes B-Feld immer einen Strom in einen Leiter induziert, im Äther, ein E-Feld erzeugt.

Und: Das ist eine typische Kettenreaktion. In dem Sinne, dass die eine Funktion, eine andere aufruft und die wieder die eine.

efeld() {
;;;bfeld();
return;
}

bfeld() {
;;;efeld();
return;
}

Eine derartige Welle, die sich auch in eine Richtung ausbreiten kann, erinnert an eine lineare Liste. Mit einer Besonderheit. Ja, eine Lineare List, lässt sich über eine WHILE-Schleife, gut handhaben, aber auch über Rekursion.
Interessant wäre jetzt, dass wir auch bei der Liste, nicht eine Funktion haben, sondern zwei Funktionen, die sich gegenseitig aufrufen.

Umgekehrt: Was wir häufig, denken, wenn wir an ein Haus und Programmierung denken, dann an UML, C++ und Haus. Und dabei ist das Haus ein Objekt, eine Klasse, was in C einer Struktur entspricht. Und diese hat gewisse Membervariablen. Wie viele Fenster hat ein Haus, wie groß ist das Haus, was für ein Dach hat das Haus, welche Farbe hat das Haus.
Seltsam ist, dass die Leute selten Fragen, was ist in dem Haus drin: Wie viele Zimmer, und was ist in den Zimmern? Sind da Betten, Schränke, ist in den Schränken etwas drin, etwa Schachteln und was ist in den Schachteln und sind Menschen in dem Haus usw. So denken wir häufig nicht ans Haus, bei C++ und UML. 

Und, wenn wir die Sache weiter gehen: Ein Hauptwunsch von uns ist es Rekursionen, Kettenreaktionen und Schachtelungen hervor zu rufen. Das fehlt uns häufig in der Politik. Und man merkt, es ist seit je her ein Bestreben da, dass irgendwie zu erreichen und hervor zu rufen. 
Politische Kettenreaktion, ist kein seltenes Wort, aber ich behaupte, man sieht es bereits an der Wahl der Posten, etwa, wie bei der Armee: Hier der Major, da der General, da der Leutnant. Ich behaupte, da steckt schon der Versuch dahinter, so etwas zu erreichen. 

Und ich denke, es ist ein bisschen, wie bei Einstein und Meisner, damals fragte man sich ja: Kann man so eine nukleare Kettenreaktion auslösen. Und ein bisschen ist es so in der Politik, kann man so eine politische Kettenreaktion auslösen. Und an dieser Stelle stellt sich tatsächlich die Frage, kann man Computermodelle bilden, die Politik und ihre Reaktionen nachbildet, und damit sogar eventuell das andere tun, als zu hören, ein zu greifen, zu handeln.

Jetzt etwas anderes: Ein typisches politisches Modell, ist das politische Tauziehen. Mich interessiert an dieser Stelle speziell, lässt sich ein Tauziehen in einer Programmiersprache darstellen. Und was wir häufig merken, was uns an der Politik ärgert, ist, dass sie immer ein Tauziehen darstellt, niemals eine vollkommen unkontrolliert ablaufende Kettenreaktion. Und das stört uns manchmal. 

Aber unabhängig davon, gibt es auch eine Rekursion, die ein Tauziehen darstellt. 

Und mein Ergebnis ist: Es müsste zwei Funktionen geben: Die eine Seite und die andere.
Nein, das Ergebnis ist anders. Wir denken, bei einer Funktion daran, dass wir in sie eintreten. Eine jede Rekursion, zeichnet sich durch ihren Eintrittspunkt aus, an den wir auch immer denken:

func() {
;;;func();
}

Woran wir selten denken, ist den Austrittspunkt: 

func() {
;;;func();
return;
}

Und ebenso wie wir steuern könnten, wie oft wir in eine Funktion eintreten:

func() {
int i;
for(i = 0; i < 100; i++)
;;;func();
return;
}

könnten wir steuern, wie oft wir austreten.
Indem wir zum Beispiel, den übergeordneten Funktionen austreten, oder, indem wir über IF-THEN-ELSE, den Code in der Funktion nicht zu lassen. Ein Tau-Ziehen.

+++

Soll, ich ihnen sagen, was mir im Bett fehlt? Eine Frau. Aber denken Sie jetzt nichts! Nicht dafür. Ja, OK, die kann ruhig nackt sein - und nichts sagen, die kann ruhig nackt sein. Den ganzen Tag - von morgens bis abends. Und die liegt die ganze Zeit nur in meinem Bett. Und sagt keinen Ton! Wichtig! Die sagt nichts. Und: Die schaut kein Fernsehen.
Und ich treibe mich den ganzen Tag in der Stadt rum. Ich weiß nicht, ich habe nichts wirklich zu tun. Ja, vielleicht ein bisschen. OK, aber: Ich mache kein Gluck-Gluck - das mache ich nicht - ich bin dagegen - ich bin Anti-Gluck-Gluck.
Und wenn ich dann abends nach Hause komme, dann liegt die da im Bett. Und dann kann ich mich neben die legen. Essen mache ich. Ich ganz alleine. Die macht nichts, die bleibt im Bett liegen. Ich mache Rührei und mache der auch eine Portion. Ja, von mir, morgens kaufe ich Brötchen. Die erlaubt mir, dass ich mir einen runter hole. Aber, das muss nicht so ein Sex sein. Und: Die will, dass wir Tanzen gehen, ausgehen. Die bleibt einfach im Bett.
Und ich war bei ein paar Prostituierten. Die erste und die letzte, besonders die erste hat mir gut gefallen. Die würde genau in das Klischee passen, in meinem Bett zu bleiben. Nackt.
Ich glaube, da würde viele Probleme vergehen. Ganz von alleine. Ja, ich meine, das mit der in der Stadt rum treiben, das ist so eine Sache. Ich meine ich hätte schon noch meine Ziele. Ich würde schon noch mein Studium machen und um die Weltformel würde ich mich immer noch bemühen.

Ich hatte mal eine Katze - ein Kater. Der lag immer bei mir im Bett. Das ist nicht dasselbe, Kater so oder so nicht. Schon eine Frau, eine nackte Frau. Von mir aus noch ein Kater oder eine Katze in der Wohnung, die legt sich dann nachts noch auf uns beide drauf.

Ich glaube da vergehen die Probleme. Ich glaube mein Olanzapin würde ich weiter nehmen. Das brauche ich zum Schlafen. Das würde ich dann immer noch brauchen. Ich liebe mein Olanzapin, da kann ich gut schlafen. Aber die Frau als Kopfkissen. Dann kann man sich bei der anschmiegen. Die schläft mit dem Rücken zu einem und man selber mit dem Gesicht zu ihr.

Ich glaube da vergehen die Probleme. Ich meine mit dem Olanzapin kann ich gut schlafen. Aber dann kann besonders gut schlafen. Dann gehen die Sorgen weg. Dann hat man keine Sorgen mehr. Ich meine ganz aufhören, zu denken will ich nicht. Kluge Formeln, Informatik und Weltformeln hätte ich trotzdem gerne. Aber woher kommen die Sorgen, ich sage es ihnen: Weil man keine Frau bei sich im Bett hat. Die Leute reden alle daher, von wegen Selbstmord und Ehre und Moral und sonst was, ich kann ihnen sagen, was die statistisch von den anderen unterscheidet: Die haben keine Frau bei sich im Bett. 

Daran kann man alles erkennen: Data Mining - Statistik - ich kann ihnen sagen, was die einen von den anderen trennt: Da liegt keine Frau im Bett. Oder man kapiert es halt - ich habe es kapiert. Wissen Sie rechnen sie mir nicht, ich sei schlechter und dümmer als die mit der Frau im Bett. Das bin ich nicht - ich nicht. Weil ich hatte mit 30 Prostituierten und darauf kommt es an. Auf sonst nichts. Zur Not, ich kann auch alleine Bett liegen - letzten Endes geht auch das. Ich schlafe ja gut mit meinem Olanzapin. Es wäre ja nur der kleine Tick, das gewisse etwas. Aber ich war ja mit 30 Frauen im Bett, das ist worauf es ankommt - klar, mit ist besser - trotzdem: Das Wesentliche ist erreicht.

Ich war halt nicht so dumm. Wissen Sie, ich habe dann keinen von wegen Moral vom Stapel gelassen. Ich glaube das ist der Unterschied - that makes the difference. Dass ich halt im entscheidenden Moment, keinen von wegen Moral vom Stapel gelassen habe und behauptet habe, die armen Frauen - und dann - na ja, ich hatte mit 15 Jahren eine Freundin - aber die Frauen nicht gehabt hätte.

Trotzdem, ich glaube das ist nebenbei, als gewisses etwas, gut für den Kopf. Ich glaube, man ist dann in Gedanken freier. So ein Kopfkissen, das ist gut. Das tut dem Körper gut. Die Leute fragen immer was man tun muss um schlau zu werden? Die Fragen das echt und dann sagen sie, Du warst oder bist doch auch in der Psychiatrie. Und da sieht man, sie können schon gar nicht mehr denken, vor ewigen Single-Dasein. Ich meine, sie müssen gar nichts tun, um schlau zu werden. Sie brauchen eine Frau, oder müssen viele Frauen gehabt haben. Frauen machen schlau. Die Leute fragen, warum bist Du schlau? Weil ich viele Frauen hatte, ganz einfach. Und: Das übersehen die Leute halt, sie haben keine Frau, und fragen, wie werde ich schlau und denken sich alles mögliche aus. Na ja, sie müssen wenigstens möglichst viele Frauen gehabt haben.

Wissen Sie: Bei manchen Substanzen, da ist das echt so. Die fühlen sich toll an. Aber, wenn man immer mit einer Frau ist, oder viele hatte, wird man klüger und klüger.

Und das ist schon so mit der Energie. Wenn man jede nacht neben einer Frau liegt, dann geht die negative Energie, in den oder die andere über. Dabei kommt sie nicht ein Mal negativ bei dem anderen an. Das wäre ja schlimm. Aber da kommt nichts negatives an. Dafür verlässt die eigene negative Energie, den eigenen Körper.
Dann wird man ruhiger.


Wissen Sie, meine Damen und Herren. Ich liefere ihnen heute abend noch zwei Ergebnisse. (1.) Das erste ist: Ich habe ihnen schon mal Kaiserschmarren gezeigt. Jetzt werde ich das aber verfeinern. Ich habe Vanillesoße und Kirschgrütze gekauft. Das tut man da drauf, dann ist es gut. 
(2.) Ich habe ihnen etwas von Schachteln gesagt und Compilern. Dass eine Box in einer Box steckt. Das war nicht nur gerdete - das nennt man Schachtelung - und das werde ich gleich heute Abend umsetzen. Die Frage ist nur wie: Die erste Idee ist: Man nehme keine dreidimensionalen Boxen, sondern Vierecke. Die zeichne man auf: Diese können (a) ineinander (b) nebeneinander (c) untereinander oder (d) nebenander und untereinander liegen. Da stellt sich gleich eine Frage: Sollen wir ein BMP zeichnen, also ein Bitmap, ein graphisches Bitmap, was auch noch so ist, dass es nur zwei Farben zulässt? Das Schwarz für den Strich nimmt und weiß für den Rest. Wie dürften denn diese Striche sein? Unterschiedlich dick? Jedenfalls müssten wir Schwarzen Punkt an Schwarzen Punkt anfügen. Und wenn der Strich in die Waagerechte geht, dann müssen wir trotzdem Senkrecht eine Dicke von 3 zum Beispiel feststellen. Und dann müssten das als Bitmap speichern. Herr David Vajda, Rappenberghalde 21, D-72070, Tübingen, Deutschland, macht einen anderen Vorschlag: Schauen Sie sich mal das an:

.................
.....#######.....
.....#.....#.....
.....#.....#.....
.....#.....#.....
.....#.....#.....
.....#######.....
.................

Auch ein Quadrat, oder? Die Punkte '.' sind in der Realität Whitespaces. Ich habe sie nur so angegeben, weil man in Facebook nicht gut mit Whitespaces arbeiten kann.

Aber wir können unsere Quadrate in einer ASCII-Plain-Text-Datei eingeben.

Was tut denn der Lexer. Die Aufgabe des Lexers, ist es eben so ein Quadrat fest zu stellen.

Was ist denn jetzt unser Ziel? Na ja, wir bauen einen Compiler. Aber als kleines Extra, machen wir daraus einen einem arithmetischen Ausdruck ähnlichen Ausdruck. Wir erzeugen also etwas Neues.


Der Kaiserschmarren ist auf dem Herd. Jetzt fangen wir mal an. Mit unserem Compiler. Zunächst der Lexer.

Ein Viereck wird durch seine Vieraußenkanten beschrieben.

[a,b,c,d]

Aber, jede Kante hat Länge und Breite

[[Länge - a, Breite - a], [Länge - b, Breite - b], [Länge - c, Breite - c], [Länge - d, Breite - d],]

Die Breite geht in die "Höhe", nach Norden und Süden, die Länge nach Westen und Osten.

Zum Erkennen eines Vierecks muss der Lexer nicht viel tun. Generell muss er an irgendeinem Punt anfangen. Dieser befindet sich in Nord-West. Also "von rechts nach links" - von "oben nach unten". Jetzt:

Wenn dort ein '#' ist, dann wandert der Lexer nach rechts, bis er auf ein White-Space stößt. Jetzt geht er den Weg nach unten. Wenn dort gleich ein White-Space kommt, meldet der Lexer einen Fehler. Er muss weiter nach unten gehen. Bis er an das nächste White-Space stößt. Dabei muss er und das muss er auch, wenn er von Westen nach Osten geht, bei jedem '#' überprüfen, ob seitlich eines ist. Wenn eines ist, ist das ein Error für den Lexer. Wir lassen einfach keine Vierecke zu, die aneinander anecken. Wenn wir jetzt wieder an der westlichen Ecke angekommen sind, müssen wir wieder nach oben gehen.

Ein Problem haben wir: Was ist mit den nebeinanderliegenden Vierecken. Die liegen ja nebeneinander und untereinander. Das ist kein Kunststück, das zu realisieren. Wir gehen einfach von Westen nach Osten. Und dann jedes Mal eine Zeile nach unten. Das ist der Anfangspunkt vom Lexer. Wenn er dann ein '#' oder sagen wir Viereck erkennt, dann ist das ein Token. Das Token wird bearbeitet. Das ändert aber nichts daran, dass er weiter beim nächsten Token von links nach rechts geht.

Damit fangen wir jetzt an.


Kaiserschmarren machen ist ganz einfach. Als Kind habe ich Ungarn immer  Palatschinta gemacht. Das ist fast dasselbe, wie Pfannekuchen. Generell gilt beim Backen: Mehl ist das wichtigste. Und beim Brot kommt Hefe dazu. Dazu sollte man vielleicht beim Brot Eier tun. Was man auch noch beim Brot rein tun kann, ist Wasser.
Wenn man Milchbrötchen - ich weiß nicht ob das Milchbrötchen sind, aber so einen milichigen Teig haben will, tut man Milch dazu. 

Bei Pfannekuchen verwendet man keine Hefe. Dafür Eier, Milch und Mehl und Zucker. Bei Pfannekuchen müssen die platt sein. Bei Kaiserschmarm, zersticht man das.