Это зависит от того, как и когда ваш компилятор будет генерировать код.
Если ваш компилятор генерирует код последовательно (от первой строки кода до последней), то единственное, что вы можете сделать, это запомнить места, куда вы хотите перейти (сохранить их в таблице), и исправьте код после того, как все было сгенерировано.
Если ваш компилятор генерирует код снизу вверх (от самого внутреннего оператора до самого внешнего оператора), и ваша базовая машина (физическая или виртуальная) поддерживает относительные переходы, то вы можете просто сгенерировать относительные переходы при генерации кода , Например.
Предположим, у вас есть этот кусок кода:
if (condition) then
someexpressionsA
else
someexpressionsB
endif;
Компиляция снизу вверх означает, что код будет сгенерирован следующим образом:
- сначала код для некоторых выражений A
- тогда код для некоторых выраженийB
- затем код для оператора if-then-else-endif
Предположим, что наш компилятор сгенерировал код для некоторых выражений A, называемый codeblockA (то же самое для B). Тогда код для оператора if-then-else-endif можно записать так (псевдокод):
- Проверить состояние
- если условие ложно, перейти к следующему размеру (codeblockA + 1) инструкции
- codeblockA
- прыжок sizeof (кодовый блок B) далее
- codeblockB
Все может стать сложнее, если условие содержит несколько условий (и, или, ...), но приведенный выше пример должен помочь вам начать работу.