логические предложения для интерпретатора и построения - PullRequest
0 голосов
/ 04 октября 2018

Я нахожусь в процессе создания переводчика, и я начал с аст-классов.Код является объектно-ориентированным в C ++.Каждое действие является «оператором», блок является самим оператором и содержит список операторов.Блоки также определяют различные области, сохраняя записи о том, какие переменные были выделены в этой области и удаляя их в конце.Выполнение состоит в основном блоке, вызывающем «execute» для каждого оператора, который он содержит, где каждый оператор может состоять из другого блока, простой инструкции или вызова функции.С этой структурой я мог бы думать о том, как реализовать большинство конструкций, (пока, если-еще), но я не понимаю, как я могу сделать goto.Несмотря на тот факт, что goto почти не используются, мне понадобится goto в качестве стартовой базы для реализации разрыва и продолжения циклов.

У кого-нибудь есть концептуальное предложение?(концептуально говоря, код не нужен).

ПРИМЕЧАНИЕ: код не выполняется построчно при разборе, сначала он полностью разбирается в ast, а затем выполняется.

1 Ответ

0 голосов
/ 04 октября 2018

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

Для меток у вас есть несколько вариантов.Вы можете превратить метки в сам узел AST или добавить атрибут к классу узла, который устанавливается только в том случае, если предыдущий оператор является меткой.При обработке вашего перехода, сделайте то же самое, что и с номерами строк.Найдите самый верхний узел с установленным атрибутом метки.

Предполагается, что ваши цели появляются в источнике до goto.В противном случае вам придется выполнить этап исправления для разрешения целей вызова, так же как и вызовы функций.

Возможно, есть лучшие способы;это как раз то, что приходит на ум.

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

...