"Джек Креншоу. Давайте создадим компилятор! " - читать интересную книгу автора

коррекцию/восстановление после ошибок. Программа, которую мы будем
создавать, будет распознавать ошибки и просто остановится на первой из них,
точно также как это происходит в Turbo Pascal. Будут и некоторые другие
приемы, которые вы увидите по ходу дела. Большинство из них вы не найдете в
каком либо учебнике по компиляторам, но они работают.
Несколько слов о стиле программирования и эффективности. Как вы
увидите, я стараюсь писать программы в виде маленьких, легко понятных
фрагментов. Ни одна из процедур, с которыми мы будем работать, не будет
состоять из более чем 15-20 строк. Я горячий приверженец принципа KISS (Keep
It Simple, Sidney - Делай это проще, Сидней) в программировании. Я никогда
не пытаюсь сделать что-либо сложное, когда можно сделать просто.
Неэффективно? Возможно, но вам понравится результат. Как сказал Брайан
Керниган, сначала заставьте программу работать, затем заставьте программу
работать быстро. Если позднее вы захотите вернуться и подправить что-либо в
вашем продукте, вы сможете сделать это т.к. код будет совершенно понятным.
Если вы поступаете так, я, тем не менее, убеждаю вас подождать пока
программа не будет выполнять все, что вы от нее хотите.
Я также имею тенденцию не торопиться с созданием модулей до тех пор,
пока не обнаружу, что они действительно нужны мне. Попытка предусмотреть все
необходимое в будущем может свести вас с ума. В наши время, время экранных
редакторов и быстрых компиляторов я буду менять модули тогда, когда
почувствую необходимость в более мощном. До тех пор я буду писать только то,
что мне нужно.
Заключительный аспект: Один из принципов, который мы будем применять
здесь, заключается в том, что мы не будем никого вводить в заблуждение с
P-кодом или воображаемыми ЦПУ, но мы начнем с получения работающего,
выполнимого объектного кода, по крайней мере, в виде программы на
ассемблере. Тем не менее, вам может не понравиться выбранный мной
ассемблер... это - ассемблер для микропроцессора 68000, используемый в моей
системе (под SK*DOS). Я думаю, что вы найдете, тем не менее, что трансляция
для любого другого ЦПУ, например 80x86, совершенно очевидна, так что я не
вижу здесь проблемы. Фактически, я надеюсь что кто-то, кто знает язык 8086
лучше, чем я, предоставит нам эквивалент объектного кода.

ОСНОВА

Каждая программа нуждается в некоторых шаблонах ... подпрограммы
ввода/вывода, подпрограммы сообщений об ошибках и т.д. Программы, которые мы
будем разрабатывать, не составляют исключения. Я попытался выполнить их на
минимальном уровне, чтобы мы могли сконцентрироваться на более важных вещах
и не заблудиться. Код, размещенный ниже, представляет собой минимум,
необходимый нам, чтобы что-нибудь сделать. Он состоит из нескольких
подпрограмм ввода/вывод, подпрограммы обработки ошибок и скелета - пустой
основной программы. Назовем ее Cradle. По мере создания других подпрограмм,
мы будем добавлять их к Cradle и добавлять вызовы этих
подпрограмм. Скопируйте Cradle и сохраните его, потому что мы будем
использовать его неоднократно.
Существует множество различных путей для организации процесса
сканирования в синтаксическом анализаторе. В Unix системах авторы обычно
используют getc и ungetc. Удачный метод, примененный мной, заключается в