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

else Expected('Addop');
end;
end;
{-}

Затем выше Expression наберите следующие две процедуры:

{-}
{ Recognize and Translate an Add }
procedure Add;
begin
Match('+');
Term;
EmitLn('ADD D1,D0');
end;
{-}
{ Recognize and Translate a Subtract }
procedure Subtract;
begin
Match('-');
Term;
EmitLn('SUB D1,D0');
end;
{-}

Когда вы закончите, порядок подпрограмм должен быть следующий:
Term (старая версия Expression)
Add
Subtract
Expression
Теперь запустите программу. Испробуйте любую комбинацию, которую вы
только можете придумать, из двух одиночных цифр, разделенных "+" или "-". Вы
должны получить ряд из четырех инструкций на ассемблере. Затем испытайте
выражения с заведомыми ошибками в них. Перехватывает анализатор ошибки?
Посмотрите на полученный объектный код. Можно сделать два замечания. Во
первых, сгенерированный код не такой, какой бы написали мы.
Последовательность
MOVE #n,D0


MOVE D0,D1

неэффективна. Если бы мы писали этот код вручную, то, возможно, просто
загрузили бы данные напрямую в D1.
Вывод: код, генерируемый нашим синтаксическим анализатором, менее
эффективный, чем код, написанный вручную. Привыкните к этому. Это в
известной мере относится ко всем компиляторам. Ученые посвятили целые жизни
вопросу оптимизации кода и существуют методы, призванные улучшить качество
генерируемого кода. Некоторые компиляторы выполняют оптимизацию достаточно
хорошо, но за это приходится платить сложностью и в любом случае это