Как работать с метками на языке сценариев, который я пишу? - PullRequest
3 голосов
/ 18 августа 2011

Так что я долго над этим размышлял, думал об этом.Сначала приведем пример кода, а затем я его объясню.

:main
    dostuff
    otherlabel

:otherlabel
    dostuff

Хорошо, в этом примере main - это то место, откуда начинается код, и он «называет» метку «otherlabel».Это на самом деле просто ярлык для команды перехода, которая изменяет выполнение в другое место в памяти.Однако моя проблема в том, как мне обработать эти метки, чтобы их не нужно было объявлять до того, как они будут вызваны?

В данный момент я делаю одношаговую компиляцию, читая прямо из источника ивыводить байт-код.Я просто работаю с метками и добавляю их в словарь, когда нахожу их.И тогда я заменяю 'otherlabel' командой перехода в правильное место в коде.Но в этом случае этот код не будет компилироваться.

Я подумал о нескольких способах сделать это:

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

Второй - это очереди вызовов меток, пока ПОСЛЕ того, как я прошёл весь файл и скомпилировалвсе остальное, а затем разбираться с ними, это выглядит намного чище.

Я пишу это на C, поэтому я бы предпочел не реализовывать сложные структуры данных, я ищу самый простой способ справиться с этим.

Ответы [ 2 ]

5 голосов
/ 18 августа 2011

Используйте несколько проходов.Одного прохода недостаточно для языка сценариев, особенно когда вы переходите к более сложным структурам.

За первый проход, перед компиляцией, создайте свой словарь меток.Позже, когда произойдет компиляция, просто используйте этот словарь.

4 голосов
/ 18 августа 2011

Вы можете использовать «backpatching», хотя, похоже, это то, что вы уже пробовали; и это может быть истолковано как сложная структура.

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

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