代码生成跳转和标记

时间:2017-09-09 20:15:51

标签: code-generation javacc

我只有这个Code Fragment,部分是JavaCC。

我的问题是jump和mark命令是如何工作的。 第9行有一个条件跳转,第16行有一个常规跳转,它总是在else条件下执行。但他们怎么知道跳到哪里? markByLable总是在Jump之后(我真的不知道它在做什么)。和第20行一样,还有另一个描述符的假标签,但是在else语句之后。 因此,如果第8行将跳转到if,如果if条件不为真,它将跳过else条件。

Code as picture with some extra statements

我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

括号中的代码不是JavaCC代码;它的Java代码。换句话说,类LabelDescriptorm_codeGen类只是用普通的Java编写的。如果您无法访问这些课程,则必须从他们的使用方式和图片中了解他们所做的工作。

最好的策略可能是询问获得图像的人。

对于像if( E ) C else D这样的if语句,您可以期望生成的代码看起来像这样

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

因此,让我们跟踪解析if( E ) C else D时执行的代码,对于某些表达式E和语句C和D,并尝试弄清楚/猜测正在进行的操作。

  1. desc = expr()解析并发出E的代码。
  2. 根据您的图片,您可以看到通话m_codeGen.falseJump(desc)正在做两件事。它制作了一个全新的标签(在我们的示例中为L1),然后发出指令跳转到它。我猜它会再做一件未在图片中显示的事情,即它创建另一个新标签(L0)并将其分配给desc.m_tLabel,因为否则该字段的初始化方式是个谜。 (也许该字段以其他方式初始化。)
  3. 下一个命令是m_codeGen.markByLabel(desc.m_tLabel)。根据你的图片,这似乎做了两件事。 (我真的在这里猜测。)它发出(?)一条NOP指令然后通过设置标签m_statement_field告诉标签(L0)它正在标记该指令。 (由于没有分支,对于L0,这个步骤可能会被省略,如果是,那么desc.m_tLabel字段是否被初始化并不重要。)
  4. stat()解析并发出C代码。
  5. 接下来是endifLabel = m_codeGen.createLabel()。显然这会创建一个新标签(L2)。
  6. 接下来是m_codeGen.jump(endifLabel);这必须发出无条件跳转(到L2)。
  7. 接下来是m_codeGen.markByLabel(desc.m_fLabel);。这会发出第二个NOP并标记它(带有L1)。
  8. stat()解析并发出D代码。
  9. 最后是m_codeGen.markByLabel(endifLabel);。这会发出最终的NOP并标记它(使用L2)。