Hallo Besucher, der Thread wurde 4,3k mal aufgerufen und enthält 16 Antworten

letzter Beitrag von ogd am

Wann dieses ";" Semikolon in Turbo Pascal rein?

  • Hallo, guten Tag.


    Ich habe Schwierigkeiten mit dem setzen vom ";" in Turbo Pascal 3.0
    Manchmal kommt deshalb ene Fehlermeldung.


    Wann darf es im Programm bitte nicht mehr erscheinen und wann muss es gesetzt werden.?


    Danke.
    Gruss


  • Anders als in C dient das ";" lediglich der Trennung von Befehlen und nicht, um diese abzuschließen. Daher spielt es auch keine Rolle, wieviele ";" man setzt. Selbst eine ganze Folge von ";;;;;;;;;;;;;;;;;;;;;;;;" wäre syntaktisch immer noch korrekt, da die ";" vom Compiler überlesen werden, vorausgesetzt, der Compiler hält sich an den Sprachstandard.
    Das obige Beispiel enthält daher auch keine syntaktischen Fehler. Sollte der Compiler hier meckern, dann folgt er schlicht nicht dem Standard.
    Ein ";" muß man nicht (aber kann man trotzdem) setzen vor "END", "ELSE", "UNTIL". Aus rein ästhetischen Gründen setzen einige es nicht, wohingegen es andere sicherheitshalber stets setzen für den Fall, daß man doch noch was hinzufügen möchte. Es ist allein Deine Entscheidung, wie Du hier vorgehen willst.
    Empfehlen würde ich hingegen das Einrücken des Quelltextes, falls das Original nicht von dem hier Gezeigten abweichen sollte. Ungefähr sowas:

  • Ein ";" muß man nicht (aber kann man trotzdem) setzen vor "END", "ELSE", "UNTIL".

    Wenn ich mich noch recht an meine PASCAL-Zeiten erinnere, darf in der Zeile vor dem ELSE kein ";" stehen, sonst gilt die IF-Anweisung als abgeschlossen und der Compiler wirft einen Fehler, weil das "ELSE" alleine steht und so keinen Sinn ergibt. Ebenso muss das letzte END im Code mit "." abgeschlossen und darf nicht mit einen ";" abgeschlossen sein.


    Das galt damals unter Standard-PASCAL auf einer microVAX II. Ich bin mir fast sicher, dass das unter TP 5.x für DOS auch so war.

    "Wenn du überredet, ermahnt, unter Druck gesetzt, belogen, durch Anreize gelockt, gezwungen, gemobbt, bloßgestellt, beschuldigt, bedroht, bestraft und kriminalisiert werden musst. Wenn all dies als notwendig erachtet wird, um deine Zustimmung zu erlangen, dann kannst du absolut sicher sein, dass das, was angepriesen wird, nicht zu deinem Besten ist." - Quelle unbekannt.


    "Steve Jobs hat User hervorgebracht, Jack Tramiel Experten." - Quelle unbekannt.

    "Mein Herr, ich teile Ihre Meinung nicht, aber ich würde mein Leben dafür einsetzen, dass Sie sie äußern dürfen." - Voltaire.

    "Diskutiere nie mit einem Idioten - er zieht dich auf sein Niveau hinunter und schlägt dich dort mit seiner Erfahrung!" - Volksweisheit.


  • darf in der Zeile vor dem ELSE kein ";" stehen, sonst gilt die IF-Anweisung als abgeschlossen und der Compiler wirft einen Fehler, weil das "ELSE" alleine steht und so keinen Sinn ergibt

    Stimmt. Du hast recht. Sorry, ich war in Gedanken zu viel beim Pascal-Nachfolger, bei dem es das Problem mit dem dangling-else nicht mehr gibt.

  • Stimmt. Du hast recht. Sorry,

    Kein Problem und kein Grund, sich zu entschuldigen. :) Irren ist männlich, sagt meine Frau immer. :D

    "Wenn du überredet, ermahnt, unter Druck gesetzt, belogen, durch Anreize gelockt, gezwungen, gemobbt, bloßgestellt, beschuldigt, bedroht, bestraft und kriminalisiert werden musst. Wenn all dies als notwendig erachtet wird, um deine Zustimmung zu erlangen, dann kannst du absolut sicher sein, dass das, was angepriesen wird, nicht zu deinem Besten ist." - Quelle unbekannt.


    "Steve Jobs hat User hervorgebracht, Jack Tramiel Experten." - Quelle unbekannt.

    "Mein Herr, ich teile Ihre Meinung nicht, aber ich würde mein Leben dafür einsetzen, dass Sie sie äußern dürfen." - Voltaire.

    "Diskutiere nie mit einem Idioten - er zieht dich auf sein Niveau hinunter und schlägt dich dort mit seiner Erfahrung!" - Volksweisheit.


  • Ein ";" muß man nicht (aber kann man trotzdem) setzen vor "END", "ELSE", "UNTIL". Aus rein ästhetischen Gründen setzen einige es nicht, wohingegen es andere sicherheitshalber stets setzen für den Fall, daß man doch noch was hinzufügen möchte. Es ist allein Deine Entscheidung, wie Du hier vorgehen willst.


    Unser Informatiklehrer hat ein einsames ";" als Fehler angekreidet, wenn seiner Meinung nach eine (überflüssige) leere Anweisung nicht Teil der Aufgabenstellung war.


    Wenn ich mich noch recht an meine PASCAL-Zeiten erinnere, darf in der Zeile vor dem ELSE kein ";" stehen, sonst gilt die IF-Anweisung als abgeschlossen und der Compiler wirft einen Fehler, weil das "ELSE" alleine steht und so keinen Sinn ergibt.


    Vor einem Else in einer Case-Anweisung muss (zumindest in Turbo Pascal) ein Semikolon stehen.


    Stimmt. Du hast recht. Sorry, ich war in Gedanken zu viel beim Pascal-Nachfolger, bei dem es das Problem mit dem dangling-else nicht mehr gibt.


    Der Pascal-Erfinder Niklaus Wirth schreibt dazu selbstkritisch in "Programmieren in Oberon":

    Zitat

    Der letzte, sehr wesentliche Punkt war die Beseitigung einiger syntaktischer Unschönheiten von Pascal, und zwar die nicht abgeschlossenen If-, While- und For-Anweisungen. Das waren genau die Formen, die in Pascal unverändert von Algol 60 übernommen worden waren, um die Tradition fortzusetzen und die Algol-Freunde nicht zu vergraulen - ein Fehler, rückblickend gesehen.

  • Unser Informatiklehrer hat ein einsames ";" als Fehler angekreidet, wenn seiner Meinung nach eine (überflüssige) leere Anweisung nicht Teil der Aufgabenstellung war.

    Oweh... Laß mich raten... Dein Informatiklehrer war so ein 1980er umgeschulter Mathematik-, Physik- oder Sonstwaslehrer, der sein Wissen aus Fortbildungskursen bezog, und dessen Programmierkenntnisse weit unter dem Niveau seiner Schüler lagen.
    In Pascal gibt es überhaupt keine "leere Anweisung". Der ";" ist in Pascal - wie Du weißt - ein Separator und bildet für sich keine Anweisung. Der Compiler erzeugt daher daraus keinerlei Code, auch keine NOP-Anweisung. Aber so war das halt damals...

    Der Pascal-Erfinder Niklaus Wirth schreibt dazu selbstkritisch in "Programmieren in Oberon"

    Oha, schön zu sehen, daß sich noch jemand mal mit Oberon beschäftigt hat. Tatsächlich ist die Syntaxdefinition von Oberon (oder des Vorgängers Modula2) um einiges sauberer als die von Pascal. Ich habe mir oft überlegt, ob ich privat mal auf dem PC in FreePascal programmieren sollte, doch die lästige BEGIN-END-Klammerung schreckt mich dann immer wieder ab. Es ist schade, daß bei all den Pascaldialekten, die der FreePascal-Compiler anbietet, noch niemand auf die Idee gekommen ist, als Variation auch Oberonsyntax zu unterstützen.

  • Laß mich raten... Dein Informatiklehrer war so ein 1980er umgeschulter Mathematik-...lehrer, der sein Wissen aus Fortbildungskursen bezog


    Bingo! :)


    Ich habe mir oft überlegt, ob ich privat mal auf dem PC in FreePascal programmieren sollte, doch die lästige BEGIN-END-Klammerung schreckt mich dann immer wieder ab. Es ist schade, daß bei all den Pascaldialekten, die der FreePascal-Compiler anbietet, noch niemand auf die Idee gekommen ist, als Variation auch Oberonsyntax zu unterstützen.


    Das hielt mich (bisher) auch davon ab, mich näher mit Free Pascal zu beschäftigen. Es gibt da zwar einen rudimänteren Modula-2 to Free Pascal translator. Der ist aber closed source und wird nicht weiterentwickelt.


    :winke: Ich auch. :D


    Bin sogar mit 3-4 Sachen im AmiNet zu finden.


    Was sind das für Sachen? Erzähl mal.

  • Wann darf es im Programm bitte nicht mehr erscheinen und wann muss es gesetzt werden.?

    Das Semikolon steht zwischen mehreren Prozeduraufrufe in einem Block- es trennt nicht, es verbindet. Also:


    begin maches end


    aber


    begin maches; unddas; unddasauchnoch end


    In Deinem Beispiel müßte es also korrekterweise heißen:


    repeat x:=x+1 until...


    Wirkliche Probleme macht es aber eigentlich nur in dem genannten Fall von


    if condition then blovk1 else block2


    Hier würde ein Semikolon am letzten Befehl von Block1 das Else in denselben hineinziehen- und da es dort kein zugehöriges IF gibt, hagelt es Fehlermeldungen.


    (Den Hinweis aufs Handbuch kann ich mir sparen, das hattest Du ja schon gesehen...)

  • Der Compiler erzeugt daher daraus keinerlei Code, auch keine NOP-Anweisung.

    Eben deswegen...

    In Pascal gibt es überhaupt keine "leere Anweisung".

    ...ist ein überflüssiges Semikolon ein 'leerer Befehl', genauer gesagt der davor/dahinter _nicht_ vorhandene Prozeduraufruf. Für sich genommen ist das durchaus eine saubere Definition des Semikolons; wenn ich von 'Butter, Käse, Milch' rede kommt ja auch kein Trennzeichen dahinter. Aber die Semantik des fertigen Listungs, vor allem wenn man nicht alles in eine Zeile schreibt, ist alles andere als intuitiv. Und nein, es wird nicht besser, wenn man den Quelltext stattdessen mit eckigen und geschweiften Klammern flutet.

  • Sowohl Wirths Pascal-Report als auch die Standartdokumente sprechen explizit vom "empty-statement".

    Danke fürs Nachschlagen.
    Den dort verwendeten Begriff "empty-statement" kann ich mir nur erklären als eine schlecht gewählte, weil mißverständliche Bezeichnung für einen Unterbereich der Definition von "simple-statement", also mit der eigentlichen Bedeutung "Unterabschnitt der Definition von 'simple-statement', die leer ist", aber nicht "leeres Statement". Es wäre wohl besser gewesen, wenn er schlicht "empty" geschrieben hätte, und Ich kann nur vermuten, daß er "-statement" ergänzt hat um anzuzeigen, wo diese Leere hingehört, denn logisch macht es weiterhin keinen Sinn, von einer "leeren Anweisung" zu sprechen. Das ";" ist und bleibt das Trennzeichen zwischen Anweisungen, keine Anweisung selbst, und jeder Compiler dürfte hier bei der Abarbeitung von Statements in einer Schleife liegen, bis kein ";" mehr kommt, d. h. irgendeine weitere semantische Analyse anders als ein Überlesen findet nicht statt. Deutlich wird die Funktion des ";" im Oberon-Report (2015), worin Wirth nur noch geschrieben hat "StatementSequence = statement {";" statement}." Auch die Syntaxdiagramme von "Pascal für den C64" (Florian Matthes, Markt&Technik 1986, S. 200) und "Apple II Pascal - Sprache" (te-wi Verlag 1985, S. 189) kennen den Begriff "Leeranweisung" überhaupt nicht. "Apple II Pascal - Sprache" (die offizielle Dokumentation zur UCSD-Pascal-Version auf dem AppleII) ergänzt lediglich im Anschluß an das Diagramm den Hinweis "Beachten Sie, daß ein "Null"-Weg durch dieses Diagramm führt. Dieses erlaubt überflüssige Semikola im Programmtext." Man könnte es auch so sagen: Der Begriff "Leeranweisung" hat keinerlei Entsprechung in der Realität.