有时在声明之前使用标签,例如:
void test() {
goto label;
label: return;
}
单程编译器解析第一条语句时,直到label:
语句出现之前,它才知道标签在哪里。
由于一个pass编译器只解析一次代码,所以没有办法单独保留label
并稍后再返回,对吗?
那么在一个编译器中处理此问题的通常方法是什么?
答案 0 :(得分:3)
两种可能性:
后修补程序。使用生成的分支操作中的目标地址字段来创建未使用的标签的链接列表,并将列表的开头放在标签符号表中。定义标签后,遍历列表,用正确的值覆盖(“修补”)每个链接。
如果允许您生成符号汇编代码,只需输出标签名称,然后让汇编器处理即可。