2017-09-09 1 views
-1

Ich habe nur dieses Code Fragment, das teilweise JavaCC ist.Codegenerierung springt und markiert

Meine Frage ist, wie funktioniert der Jump and Mark-Befehl. In Zeile 9 gibt es einen bedingten Sprung und in Zeile 16 gibt es einen regulären, der immer in der else-Bedingung ausgeführt wird. Aber woher wissen sie, wohin sie springen sollen? Das markByLable ist immer nach dem Sprung (ich weiß wirklich nicht, was es tut). Und wie in Zeile 20 gibt es eine weitere falsche Beschriftung von Descriptor, aber nach der Else-Anweisung. Wenn also Zeile 8 zu ihr springen würde, falls die if-Bedingung nicht wahr ist, würde sie über die else-Bedingung springen.

Code as picture with some extra statements

Ich würde wirklich schätzen die Hilfe.

Antwort

0

Der Code in Klammern ist kein JavaCC-Code; es ist Java-Code. Mit anderen Worten, die Klassen Label, Descriptor und die Klasse m_codeGen sind nur in gewöhnlichem Java geschrieben. Wenn Sie keinen Zugriff auf diese Klassen haben, müssen Sie herausfinden, was sie tun, wie sie verwendet werden und aus Ihrem Bild.

Die beste Strategie könnte sein, die Person zu fragen, von der das Bild stammt.

Für eine if-Anweisung wie sagen if(E) C else D Sie der generierte Code so etwas wie dieses

[Code for E] 
JUMP_IF_FALSE to L1 
L0: NOP 
[Code for C] 
JUMP to L2 
L1: NOP 
[Code for D] 
L2: NOP 

Sos verfolgen lassen Sie den Code ausgeführt wird, während if(E) C else D Parsen, für einige Ausdruck E und Aussagen C und D sehen erwarten können und versuchen Sie herauszufinden, was passiert.

  1. desc = expr() Parsen und gibt Code für E.
  2. auf dem Bild basiert, können Sie sehen, dass der Anruf m_codeGen.falseJump(desc) zwei Dinge tut. Es erstellt ein brandneues Label (L1 in unserem Beispiel) und gibt dann eine Anweisung aus, um dorthin zu springen. Ich würde vermuten, dass es noch eine Sache gibt, die nicht im Bild gezeigt wird, nämlich dass es ein neues Label (L0) erstellt und es demc.m_tLabel zuweist, da es sonst ein Rätsel ist, wie dieses Feld initialisiert wird. (Vielleicht wird dieses Feld auf andere Weise initialisiert.)
  3. Der nächste Befehl ist m_codeGen.markByLabel(desc.m_tLabel). Basierend auf Ihrem Bild scheint dies zwei Dinge zu tun. (Ich rate wirklich hier.) Es sendet (?) Eine NOP-Anweisung und dann teilt es der Beschriftung (L0) mit, dass es diese Anweisung kennzeichnet, indem es m_statement_field des Etiketts setzt. (Da es keine Verzweigung zu L0 gibt, könnte dieser Schritt möglicherweise weggelassen werden, und dann wäre es egal, ob das Feld desc.m_tLabel initialisiert ist oder nicht.)
  4. analysiert und emittiert Code für C.
  5. Als nächstes ist endifLabel = m_codeGen.createLabel(). Das schafft natürlich ein neues Label (L2).
  6. Nächste ist m_codeGen.jump(endifLabel); Dies muss den unbedingten Sprung (zu L2) emittieren.
  7. Als nächstes ist m_codeGen.markByLabel(desc.m_fLabel);. Dies emittiert das zweite NOP und markiert es (mit L1).
  8. analysiert und emittiert Code für D.
  9. Schließlich ist m_codeGen.markByLabel(endifLabel);. Dies emittiert das endgültige NOP und markiert es (mit L2).