我只有这个Code Fragment,部分是JavaCC。
我的问题是jump和mark命令是如何工作的。 第9行有一个条件跳转,第16行有一个常规跳转,它总是在else条件下执行。但他们怎么知道跳到哪里? markByLable总是在Jump之后(我真的不知道它在做什么)。和第20行一样,还有另一个描述符的假标签,但是在else语句之后。 因此,如果第8行将跳转到if,如果if条件不为真,它将跳过else条件。
Code as picture with some extra statements
我非常感谢你的帮助。
答案 0 :(得分:0)
括号中的代码不是JavaCC代码;它的Java代码。换句话说,类Label
,Descriptor
和m_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,并尝试弄清楚/猜测正在进行的操作。
desc = expr()
解析并发出E的代码。m_codeGen.falseJump(desc)
正在做两件事。它制作了一个全新的标签(在我们的示例中为L1),然后发出指令跳转到它。我猜它会再做一件未在图片中显示的事情,即它创建另一个新标签(L0)并将其分配给desc.m_tLabel,因为否则该字段的初始化方式是个谜。 (也许该字段以其他方式初始化。)m_codeGen.markByLabel(desc.m_tLabel)
。根据你的图片,这似乎做了两件事。 (我真的在这里猜测。)它发出(?)一条NOP指令然后通过设置标签m_statement_field
告诉标签(L0)它正在标记该指令。 (由于没有分支,对于L0,这个步骤可能会被省略,如果是,那么desc.m_tLabel
字段是否被初始化并不重要。)stat()
解析并发出C代码。endifLabel = m_codeGen.createLabel()
。显然这会创建一个新标签(L2)。m_codeGen.jump(endifLabel);
这必须发出无条件跳转(到L2)。m_codeGen.markByLabel(desc.m_fLabel);
。这会发出第二个NOP并标记它(带有L1)。stat()
解析并发出D代码。m_codeGen.markByLabel(endifLabel);
。这会发出最终的NOP并标记它(使用L2)。