gpt4 book ai didi

parsing - 在编译器中生成中间代码。处理条件时是否总是需要 AST 或解析树?

转载 作者:行者123 更新时间:2023-12-04 07:28:31 24 4
gpt4 key购买 nike

我正在学习一个编译器设计类,我们必须在其中实现我们自己的编译器(使用 flex 和 bison)。我有解析的经验(编写 EBNF 和递归下降解析器),但这是我第一次编写编译器。

语言设计非常开放(教授留给我们)。在类里面,教授仔细地生成了中间代码。他说我们在解析的时候不需要构造抽象语法树或者解析树,我们可以边走边生成中间代码。

我发现这令人困惑有两个原因:

  • 如果在定义之前调用函数怎么办?您如何解决分支目标?我想您必须制定一条规则,即您必须在使用函数之前定义它们,或者可能预先定义它们(就像 C 一样?)
  • 你会如何处理条件句?如果您有 if-else甚至只是一个 if , 你如何解决 if 的分支目标当条件为 false (如果您正在生成代码)?

  • 我计划生成一个 AST,然后在创建它之后遍历树,以解析函数和分支目标的地址。这是正确的还是我错过了什么?

    最佳答案

    您的两个问题的一般解决方案是保留需要“修补”的地址列表。您生成代码并为丢失的地址或偏移量留下漏洞。在编译单元结束时,您会浏览漏洞列表并填充它们。

    在 FORTH 中,补丁的“列表”保存在控制堆栈中,并在每个控制结构终止时展开。见 FORTH Dimensions

    轶事:早期的 Lisp 编译器(我相信它是 Lisp)生成了一个符号格式的机器代码指令列表,其中包含对每个条件分支的机器代码列表的前向引用。然后它生成二进制代码遍历列表 向后 .这样,当需要发出分支指令时,所有前向分支的代码位置都是已知的。

    关于parsing - 在编译器中生成中间代码。处理条件时是否总是需要 AST 或解析树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5359391/

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