Как один проход C компилятор справляется с метками? - PullRequest
1 голос
/ 10 июня 2019

Иногда метки используются перед объявлением, например:

void test() {
  goto label;
  label: return;
}

, когда однопроходный компилятор анализирует первый оператор, он не знает, где находится метка, пока не придет оператор label:.

Так как однопроходный компилятор анализирует код только один раз, нет никакого способа оставить label в покое и вернуться позже, верно?

Так, как обычно поступают с этимв одном компиляторе?

1 Ответ

3 голосов
/ 10 июня 2019

Две возможности:

  1. Backpatch.Используйте поле адреса назначения в сгенерированной операции ветвления, чтобы создать связанный список неразрешенных вариантов использования метки, поместив заголовок списка в таблицу символов метки.Когда метка определена, пройдитесь по списку, переписав («исправляя») каждую ссылку с правильным значением.

  2. Если вам разрешено генерировать символьный код сборки, просто выведите меткуимя и пусть ассемблер справится с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...