Wie erkennen Interpreter in der Programmierung if-else-end Blöcke bzw. wie wird hierbei speziell die Zugehörigkeit von else und endif zu einem if ermittelt? Gibt es hierzu gescheite FAQ´s oder Tutorials im Netz, die aufzeigen, wie solch eine Struktur abgearbeitet wird? ...am besten mit Codebeispielen untermalt.
Gruß
hmm... versteh das Problem nicht.
bei den meisten Sprachen beendest Du doch einen IF Block eindeutig, entweder, in C, mit der Klammer, oder, wie in Perl oder BASH durch ein ENDIF oder FI
Wenn innerhalb dieses Blockes ein neues IF kommt, dann wird der alte quasi auf den Stack geschoben und ein neuer Kontext eröffnet.
pj
über welche Programmiersprache redest du?
if (bedingung) then (ja-block) else (nein-block) endif
Die Schlüsselworte sind manchmal von Programmiersprache zu Programmiersprache unterschiedlich, das Verfahren immer gleich: Der Interpreter/Compiler prüft die Bedingung, ist diese wahr (logisch richtig), dann wird der ja-block (kann auch ein einzelnen Kommando sein) abgearbeitet. Im falsch-Fall, wird der nein-block (Kommando) abgearbeitet. Der else- (nein-block) Zweig kann auch entfallen.
Beispiel:
if (Frage gelesen und verstanden)
then
{ Antwort formulieren und einhacken }
else
{ lieber schweigen und nichts sagen }
(end)if

Ein Interpreter erkennt IF-ELSE-Blöcke gar nicht.
Wenn sie jemand erkennt, dann der Parser, also der Programmteil, der den Quellcode Zeichen für Zeichen "durchliest" und anhand der ihm bekannten (und unbekannten) "Tokens" analysiert.

Das ist ein großes Thema in der theoretischen Informatik. Ich versuche mal, es ganz grob darzustellen.
Eine Programmiersprache ist eine Sprache mit einer sogenannten kontextfreien Grammatik. Das heißt, die Wörter bedeuten immer das gleiche, vollkommen unabhängig vom Textzusammenhang. Das ist anders als bei natürlichen Sprachen, wo der Kontext immer eine Rolle spielt. Aber um dies auszuwerten, benötigt man eine Intelligenz, die der Rechner nicht hat.
Eine kontextfreie Grammatik ist nach bestimmten Regeln aufgebaut, die der Parser dann einfach durchspielt. Dort ist dann ebenfalls geregelt, welche Anweisungen in den If-Blöcken stehen dürfen. Diese Regeln werden in der Backus-Naur-Form oder in der erweiterten Backus-Naur-Form angegeben.
Sie basiert darauf, dass bestimmte Regeln auf andere Regeln abgeleitet werden können. Das bedeutet, dass eine Regel aus mehreren anderen bestehen kann. So kann die If-Anweisung abgeleitet werden auf if <Bedingung> then <Anweisungen> fi oder auf if <Bedingung> then <Anweisungen> else <Anweisungen> fi.
Der Interpreter kennt diese Regeln und springt dann jeweils in die passende abgeleitete Regel. Wenn diese abgearbeitet ist, springt er wieder zurück in die obere Regel. Und so kann er Anfang und Ende zuordnen.
Die Schlüsselwörter werden dazu wohl in einem Keller abgespeichert. Das heißt, dass neue Elemente von ben drauf gelegt werden. Elemente können nur von oben wieder gelöscht werden, also die neuen Elemente zuerst. Mal angenommen, du hast zwei If-Anweisungen, dann wird erst das erste if gespeichert, dann das zweite if. Wenn der Parser ein fi findet, wird das zweite if gelöscht. Das heißt, er muss noch ein fi finden, sonst liegt ein Fehler vor. Er kann auch wieder ein if finden oder ein else. Dieses Schlüsselwort kommt wieder auf den Keller, bis das entsprechende Ende gefunden wird.
Das ist sehr schwer kurz zusammenzufassen. Such im Internet mal nach kontextfreien Sprachen, Kellerautomaten und Backus-Naur-Form. Vielleicht findest du dort etwas.