Syntaxbaum

Hallo
Ich habe bei der Aufgabe meine Schwierigkeiten und wollte fragen, ob mir jemand helfen kann

Aber gerne. Was genau sind denn die Schwierigkeiten?

3 Like

Moin,

erstmal gucken, was ein dangling else überhaupt ist. Die Aufgabenstellung riecht ein wenig nach akademischem Quark.

Gruß
Ralf

Hallo,

ich habe keinerlei Ahnung von Java, allerdings würde ich das Beispielprogramm bereits so interpretieren dass es bereits das Problem darstellt. Meiner Meinung nach hat die Aufgabenstellung selber ein Problem mit der Grammatik und ist dadurch irreführend. Vermutlich gehört die „mit“-Zeile gar nicht zum Satz "Eine vereinfachte Grammatik dafür ist… sondern zu dem Beispielprogramm und dem darauffolgenden Satz, also:

Mit
     *Programmzeile*
     *Programmzeile*
     *Programmzeile*
     *Programmzeile*
finden sie ein Programm, das in dieser Grammatik mehrdeutig ist."

Dementsprechend würde ich davon ausgehen dass sich die Aufgabe auf das angegebene Programm bezieht und man dazu die zwei möglichen Interpretationen finden soll, also einfach nur korrekte Schreibweise und wie es ein Leser falsch interpretieren könnte.

Das war auch mein erster Gedanke. Ich war dann nur etwas enttäuscht dass mehrdeutig auf die Interpretation durch einen Benutzer bezogen ist, nicht auf das Programm selber. Im Prinzip ist es also nur das Standartproblem: Der Computer bzw. das Programm macht das was man ihm sagt, nicht das was man von ihm erwartet.

Gruß
Tobias

ist kein Programm, sondern eine kontextfreie Grammatik zur Erzeugung von syntaktisch korrekten if-then-else-Statements. Auf Basis so einer Grammatik kann man einen Parser konfigurieren, der ein gegebenes Programm auf syntaktische Korrektheit überprüft.

Ich warte immer noch darauf, dass der Fragesteller sagt, was denn seine Schwierigkeiten sind…

1 Like

Ihr Lieben,
wenn wir für das gleiche Programm verschiedene Syntaxbäume finden können, heißt das ja, dass die Grammatik mehrdeutig ist. Aber folgt daraus automatisch, dass auch das Programm mehrdeutig ist?
Liebe Grüße
vom Namenlosen

Das ist es keineswegs. Einerseits muss man sich dieser Problematik bei der Programmierung von Parsern bewusst sein, wenn man if-then-else-Anweisungen ohne einschließende Klammer/abschließendes End If bzw. eindeutige Formatierungen o.ä. zulassen will. Andererseits ist die Kenntnis dieser Problematik auch in der Anwendung entsprechender Anweisungen im Rahmen der Programmierung und insbesondere auch bei der Fehlersuche wichtig. Sonst kann es leicht passieren, dass bei verschachtelten If-Anweisungen ein einzelnes else dem falschen if zugeordnet wird und man dann davor sitzt und sich fragt, warum ein Programm nicht tut, was „es soll“ (tut es schon, allerdings anders als man ohne Kenntnis dieser Problematik denkt, dass es funktionieren sollte).

1 Like

Servus,

ich finde die Fragestellung ein wenig scheps, weil sie unterstellt, man könne mehrdeutige Programme konstruieren. Kann man natürlich nicht, die Mehrdeutigkeit liegt im Auge des Betrachters: Er schaut nicht genau hin, sondern lässt sich lieber von scheinbar klaren Strukturen aufs Kreuz legen.

Möglicherweise will die Aufgabe nur zeigen, dass manche Syntax Klarheit vortäuscht, wo keine ist.

Gruß
Ralf

Naja, zwei Implementationen (oder Versionen) übersetzen dasselbe Programm unterschiedlich. Das ist in meinen Augen mehrdeutig.

Servus,

jede Implementierung einer Sprache setzt eine Syntax voraus. Wenn sich ein Ersteller daran nicht hält, ist nichts mehrdeutig, sondern eine Implementierung schlicht falsch.

Gruß
Ralf

In meinen Augen geht es hier vielmehr darum, dass ein Parser mit der oben angegebenen Grammatik nicht hinreichend bestimmt ist und damit je nach Implementierung zu unterschiedlichen Interpretationen eines Quelltextes mit geschachtelten If-then-elseAnweisungen ohne Abschluss kommen kann, wobei beide Varianten durchaus valide sind. Die Erwartungshaltung des Programmierers wird aber eine bestimmte sein, die somit aber nicht unbedingt zur gerade vorgefundenen Implementierung passen muss. Insoweit müsste man sich also bzgl. jeder Implementierung der Tatsache vergewissern, wie sie mit entsprechendem Code umgeht, oder durch geeignete Maßnahmen wie die Verwendung nur optionaler Abschlüsse sicherstellen, dass ein else eindeutig einem der geschachtelten if zugeordnet wird, Wobei letzteres den Vorteil der Portabilität hat, weil man mit einem solchen Code dann problemlos die Implementierung wechseln kann.

Insoweit sehe ich hier auch durchaus eine hohe Praxisrelevanz dieses Themas.

Wie implementiert man denn eine mehrdeutige Syntax richtig?

Wer schreibt denn solche Pflichtenhefte?

Z.B. jemand, der URLs parsern möchte. Die URL-Syntax krankt nämlich exakt an Mehrdeutigkeit bei Kontextfreiheit. Und das ist wohl das prominenteste Beispiel.

Hm. Und die Mehrdeutigkeit der Spezifikation ließe sich durch geeignete Grammatik heilen?

Das Ziel ist, durch eine geeignete Spezifikation zu erreichen, dass eine kontextfreie Grammatik existiert. Das erleichtert das Parsen.

Hm. Und wer schreibt die Spezifikation?

Selbstredend, evtl. auf Kosten der Kontextfreiheit. C99 z.B. hat das dangling-else Problem durch die Klausel 6.8.4.1.3 gelöst:

An else is associated with the lexically nearest preceding if that is allowed by the syntax.

W3 hat auf die URL-Problematik reagiert, indem sie den URI/IRI definiert haben, der die URL ablöst.

1 Like