Parsing 单通道C编译器如何处理标签?

Parsing 单通道C编译器如何处理标签?,parsing,compiler-construction,Parsing,Compiler Construction,有时在声明之前使用标签,例如: void test() { goto label; label: return; } 当一次性编译器解析第一条语句时,它不知道标签在哪里,直到label:语句出现 由于一次编译只解析一次代码,因此无法单独保留标签,稍后再返回,对吗 那么在一个编译器中处理这个问题的通常方法是什么呢?有两种可能: 背贴。在生成的分支操作中使用destination address(目标地址)字段创建标签未解析使用的链接列表,将列表的标题放入标签符号表中。定义标签后,遍历列表

有时在声明之前使用标签,例如:

void test() {
  goto label;
  label: return;
}
当一次性编译器解析第一条语句时,它不知道标签在哪里,直到
label:
语句出现

由于一次编译只解析一次代码,因此无法单独保留
标签
,稍后再返回,对吗

那么在一个编译器中处理这个问题的通常方法是什么呢?

有两种可能:

  • 背贴。在生成的分支操作中使用destination address(目标地址)字段创建标签未解析使用的链接列表,将列表的标题放入标签符号表中。定义标签后,遍历列表,用正确的值覆盖(“修补”)每个链接

  • 如果允许生成符号汇编代码,只需输出标签名,并让汇编程序处理即可


  • 所以在案例1中,即使编译器是一个单通道编译器,它仍然有一些缺点,对吗?在案例2中,这是否意味着如果没有定义标签,我就不能生成错误消息?@Reavinesadesk:你需要使用backpatch来正确处理if-then-else、前端测试的环路和短路布尔值等等。因此,它是单通道编译器中的标准技术。如果你不能回补(例如,你不能在内存中保存编译后的代码),那么你需要一个额外的过程。至于“让汇编程序做”选项,你也可以让汇编程序提供未定义的标签错误。尽管没有什么可以阻止您保留一组尚未定义的标签(或映射到首次使用的行),并在看到定义时从集合中删除标签。然后,在最后为从未定义的标签生成错误。(未定义的标签错误总是出现在作用域的末尾,因为您之前无法知道标签不会被定义..)