“if”语句的代码生成 - 编译器

时间:2011-02-16 10:33:13

标签: c compiler-construction code-generation semantic-analysis

我正在为C语言开发编译器,并且在语义分析和代码生成阶段遇到了一些困难。 我的问题如下: 1)对于if语句,以下是语法:

if (expression) then
statement1;
statement2;
else
statement3;
end if;

现在,在我的目标代码中,它必须是带有转到语句的3地址代码,所以它应该

look something like:
if (Rx)  // Rx is the register where the expression is evaluated and stored
go to X1 //for if part
X2 // for else part;

现在,我的问题是,如何为“转到”语句生成地址?

2)这个问题是关于语义分析的:    我已经能够为单个函数构建和使用符号表。我应该使用什么方法来为函数调用构建符号表?换句话说,对于不同的词汇水平?我知道这应该以某种方式涉及多棵树。一个功能一棵树。但是,从程序中间某处指向不同树的方法是什么?

我是初学者,因此任何建议/想法都会受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

这取决于编译器生成代码的方式和时间。

如果您的编译器按顺序生成代码(从代码的第一行到最后一行),那么您唯一能做的就是记住要跳转到的位置(将它们存储在表中),在生成所有内容后修补代码。

如果您的编译器自下而上生成代码(从最内部语句到最外部语句),并且底层机器(物理或虚拟)支持相对跳转,那么您可以在生成代码时生成相对跳转。例如。

假设你有这段代码:

if (condition) then
   someexpressionsA
else
   someexpressionsB
endif;

自下而上的编译意味着代码将按如下方式生成:

  • 首先是someexpressionsA的代码
  • 然后是someexpressionsB的代码
  • 然后是if-then-else-endif语句的代码

假设我们的编译器为someexpressionsA生成了代码,称为codeblockA(对于B来说是相同的)。然后if-then-else-endif语句的代码可以这样编写(伪代码):

  • 检查条件
  • 如果条件为false则跳转sizeof(codeblockA + 1)指令进一步
  • codeblockA
  • 进一步跳转sizeof(codeblockB)
  • codeblockB

如果条件包含多个条件(和,或......),事情可能会变得棘手,但上面的例子应该让你开始。

答案 1 :(得分:0)

您是否立即生成代码,没有可以解析符号标签的“汇编程序”传递?在这种情况下,您必须构建一个包含所有标签和分支指令的表,然后在生成所有标签后重新编译代码。