Ich untersuche einen Java-Grammatik-Parser und bin auf dieses komische Stück Code gestoßen, das ich normalerweise nicht in gewöhnlichem Code verwenden würde. Genommen von Ссылка
Es hat viele Funktionen, die Code wie
enthalten %Vor%Auf einen Blick erscheint es seltsam, aber zweifellos ist es gültig, wie ich es kompilieren kann. Aber kann jemand erklären, wie es funktioniert? Ich habe versucht, ungültige Java-Syntax einzugeben, und es macht seine Arbeit! Ich bin verwirrt. Wie werfen die paar Zeilen nach der Rückgabe eine Ausnahme?
Das ist tatsächlich ein gültiger Code, ohne alles zu sehen, kann ich einige Seltsamkeiten sehen:
token
IDENTIFIER
Dann:
%Vor% Dies ist eine Endlosschleife, die so lange läuft, wie jj_2_17(2)
true
zurückgibt, aber erscheint , um an diesem Ergebnis nichts zu tun. Es bricht von label_23
ab, wenn der Ausdruck false
war. Um zukünftige Leser noch mehr zu verwirren, macht es dann Dinge nur dann, wenn der Ausdruck true
ist (wie es bei false
bricht), nämlich die letzten drei Zeilen.
Für weitere Informationen ist label_23
einfach eine Bezeichnung, die nur für while
und for
Schleifen verwendet werden darf. Sie können dann aus dieser Schleife entfernen, wenn Sie break labelName;
verwenden.
Beispiel, das innerhalb einer inneren Schleife aus einer äußeren Schleife ausbricht:
%Vor% Sie können auch continue
in Kombination mit Labels verwenden.
Dann sehen wir einen Bereichsblock ohne Guard, der immer ret
zurückgibt:
Also ist alles gültig. Ich denke, wir können auch mit großer Wahrscheinlichkeit feststellen, dass dieser Code maschinengeneriert wurde.
Was hier vielleicht weitgehend verwirrt ist, ist, dass if-else im while blockiert.
%Vor%
Das ist tatsächlich nichts anderes als ein negiertes if:
%Vor% Tatsächlich gibt dieser Code nur die letzte QualifiedNameExpr(/*...*/);
zurück, die geparst werden könnte.
Zum "unerreichbaren Wurf", den Sie in Kommentaren erwähnen. Stellen Sie sich vor, was passiert, wenn Sie eine Methode (in Eclipse oder Netbeans) erstellen und keine return-Anweisung hinzufügen.
Der generierte Code (unter der Annahme, dass dieser Code hier erzeugt wird) enthält dann keine return-Anweisung und plötzlich wird der Fehler ausgegeben. Dies führt zu eclipse / netbeans / [IDE hier einfügen] und sagt dir "Fehlende Return-Anweisung in Funktion", was genau diese Aussage für ... ist.
Tags und Links algorithm java syntax syntax-error