Gelegentlich verwendete Java-Syntax (JavaParser)?

9

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?

    
Nederealm 28.05.2014, 07:52
quelle

2 Antworten

3

Das ist tatsächlich ein gültiger Code, ohne alles zu sehen, kann ich einige Seltsamkeiten sehen:

  • 'Falsche' Benennung von Variablen und Methoden, manchmal mit PascalCase.
  • Instanzvariable token
  • Statische Variable 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:

%Vor%

Also ist alles gültig. Ich denke, wir können auch mit großer Wahrscheinlichkeit feststellen, dass dieser Code maschinengeneriert wurde.

    
skiwi 28.05.2014, 08:02
quelle
0

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.

    
Vogel612 28.05.2014 08:20
quelle