/media/sda-magnetic/david/Extern-Magnetic-2022-06-29/Extern01/Dokumente-2021-05-8/disk10-ab-2020-01-10/02-debian-pc2-work/informatik/pascal-compiler/siac4t/fortsetzung.txt


OK, ich arbeite jetzt an meinen "TCP/IP-Client-Server-Compiler" weiter. Was für einen Namen soll der eigentlich kriegen? Compiler-Protocol for telnet. Programming Language Protocol for telnet. Oder so. Jetzt muss ich erst ein Mal den Bug bei den expressions, terms, factors raus machen.

Ja, ja, yeappeah!! Eyeaa! Ich habe den Fehler gefunden. Also, das war ein kleines etwas. Das ist eine ganz dämlich Geschichte. Ich habe noch keine Zahlen im Code zum Verarbeiten. Das heißt, es gibt als Variablennamen 'a' bis 'z' aber nicht 0, 1, 2, ..., 10, 11, ... Und das Problem war in der Schleife stand:

while i < a do 
  while i < a + 1 do
    i := b + 1
  od
od

Und jetzt steht da: 

while i < a do 
  while i < a + c do
    i := (b + d)*e+d*(f*g)
  od
od

Und das zweite geht. Es war aber tatsächlich noch eine Art Fehler vorhanden. Das wusste ich aber. Nämlich bisher standen da so Sachen wie:

int term(void) {

    char str[256];

    int buf_i_start;

    int retval = 0;

    int buf_j;

    

    buf_i_start = buf_i;

    

    printf("%i \n", buf_i);

    getchar();

    

    if (retval = (retval || factor())) {

        if(retval = (retval || term2 ()));

        else {

            buf_i = buf_i_start;

            retval = 0;

        }

    }

    else {

        buf_i = buf_i_start;

        retval = 0;

    }

return retval;

}

Und das ist ganz falsch. Ich habe es ersetzt durch:

int term(void) {

    char str[256];

    int buf_i_start;

    int retval = 1;

    int buf_j;

    int retval2;

    int retval3;

    

    buf_i_start = buf_i;

    

    printf("Hallo\n");

    

    retval2 = factor();

    if (retval2) {

        retval3 = term2 ();

        if(retval3);

        else {

            buf_i = buf_i_start;

            retval = 0;

        }

    }

    else {

        buf_i = buf_i_start;

        retval = 0;

    }

return (retval | retval2 | retval3);

}

Und das ist viel besser. Ich habe jetzt in den Funktionen, term(), term2(), numexpr(), numexpr2(), drei Return-Values.

retval

retval2

retval3

Und erstens ein Mal darf man nicht schreiben:

retval = 1

retval2 = (retval || function());

Weil jetzt ist retval 1 und die Prüfung der Funktion function() findet nicht statt, weil retval schon 1 ist und mit Oder II muss das nicht geprüft werden. Natürlich ist das so oder so Quatsch dieser Satz, aber so ungefähr.

Das zweite ist, warum habe ich nicht nur retval2 zu retval, sondern auch retval3? 

Ganz einfach:

Ich rufe zum Beispiel sagen wir mal term() auf und dann expression();

Am Ende ist der Return-Value

return (retval || retval2 || retval3);

Wenn jetzt retval2 = term() und das ist richtig. Dann ergibt das bei den || (Oder) richtig. Umgekehrt: Wenn expression() aufgerufen wird. Der Ausdruck

(a+c)*d+(e*f)*k od

Wobei od das Ende der Schleife einleitet, die mit do beginnt, ist so oder so irgendwann falsch. Wenn wir bei dem "od" angekommen sind. Ist das als arithmetischer Ausdruck falsch.

Das bedeutet am Ende, hier gibt irgendwo numexpr() den Wert 0 (falsch) zurück. Trotzdem war der Ausdruck vorher richtig. Deswegen die || (Oder) Und deswegen retval, retval2, retval3.

Weil: Wenn retval2 = term() oder so, und retval3() = expression() mag expression() falsch sein, term() ist es nicht. Aber am Ende ist es richtig: Arithmetischer Ausdruck, wegen term().

Das jetzt auf  meiner Homepage. Dann muss einkaufen, dann mache ich weiter.