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

end;
{-}

Заметьте снова, как легко мы можем дополнять синтаксический анализатор,
и как хорошо код Паскаля соответствует синтаксису БНФ.
Как обычно, откомпилируйте новую версию и убедитесь, что анализатор
корректно распознает допустимые предложения и отмечает недопустимые
сообщениями об ошибках.

УНАРНЫЙ МИНУС

На данном этапе мы имеем синтаксический анализатор, который
поддерживает почти любые выражения, правильно? ОК, тогда испробуйте
следующее предложение:
-1
Опс! Он не работает, не правда ли? Процедура Expression ожидает, что
все числа будут целыми и спотыкается на знаке минус. Вы найдете, что +3
также не будет работать, так же как и что-нибудь типа:
-(3-2).
Существует пара способов для исправления этой проблемы. Самый легкий
(хотя и не обязательно самый лучший) способ - вставить ноль в начало
выражения, так чтобы -3 стал 0-3. Мы можем легко исправить это в
существующей версии Expression:

{-}
{ Parse and Translate an Expression }
procedure Expression;
begin
if IsAddop(Look) then
EmitLn('CLR D0')
else
Term;
while IsAddop(Look) do begin
EmitLn('MOVE D0,-(SP)');
case Look of
'+': Add;
'-': Subtract;
else Expected('Addop');
end;
end;
end;
{-}

Я говорил вам, насколько легко мы сможем вносить изменения! На этот раз
они стоили нам всего трех новых строчек Паскаля. Обратите внимание на
появление ссылки на новую функцию IsAddop. Как только проверка на addop
появилась дважды, я решил выделить ее в отдельную функцию. Форма функции
IsAddop должна быть аналогична форме функции IsAlpha. Вот она:

{-}