gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:06:54 32 4
gpt4 key购买 nike

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

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

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

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;

那么现在,我的问题是,如何为“go to”语句生成地址?

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

我是初学者,因此非常感谢任何建议/想法。

最佳答案

这取决于您的编译器如何以及何时生成代码。

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

如果你的编译器自底向上生成代码(从最里面的语句到最外面的语句),并且你的底层机器(物理或虚拟)支持相对跳转,那么你可以在生成代码时简单地生成相对跳转.例如。

假设您有这段代码:

if (condition) then
someexpressionsA
else
someexpressionsB
endif;

自下而上的编译意味着代码会这样生成:

  • 首先是一些表达式A的代码
  • 然后是一些表达式的代码B
  • 然后是 if-then-else-endif 语句的代码

假设我们的编译器已经为一些表达式A生成了代码,称为codeblockA(B也一样)。那么if-then-else-endif语句的代码可以这样写(伪代码):

  • 检查条件
  • 如果条件为假,则进一步跳转 sizeof(codeblockA+1) 指令
  • 代码块A
  • 进一步跳转 sizeof(codeblockB)
  • 代码块B

如果条件包含多个条件(和、或、...),事情可能会变得更棘手,但上面的示例应该可以帮助您入门。

关于 "if"语句的代码生成 - 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5015302/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com