Если вы goto
обращаетесь к номерам строк, просто добавьте атрибут к вашему классу узлов AST, указывающий, на какой строке он объявлен в источнике.При выполнении узла goto
найдите самый высокий узел в дереве с этим номером строки и свяжите его как свою цель goto
.
Для меток у вас есть несколько вариантов.Вы можете превратить метки в сам узел AST или добавить атрибут к классу узла, который устанавливается только в том случае, если предыдущий оператор является меткой.При обработке вашего перехода, сделайте то же самое, что и с номерами строк.Найдите самый верхний узел с установленным атрибутом метки.
Предполагается, что ваши цели появляются в источнике до goto
.В противном случае вам придется выполнить этап исправления для разрешения целей вызова, так же как и вызовы функций.
Возможно, есть лучшие способы;это как раз то, что приходит на ум.
По сути, ваш goto является jmp
, и вам нужен способ для определения целевого адреса.Я бы просто проанализировал источник, а затем сделал бы второй проход, чтобы исправить любые gotos, у которых был бы указатель на первый узел AST после метки.