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

Term;
while Look in ['+', '-'] do begin
EmitLn('MOVE D0,-(SP)');
case Look of
'+': Add;
'-': Subtract;
else Expected('Addop');
end;
end;
end;
{-}

Конфетка! Почти работающий транслятор в 55 строк Паскаля! Получаемый
код начинает выглядеть действительно полезным, если не обращать внимание на
неэффективность. Запомните, мы не пытаемся создавать сейчас самый компактный
код.

КРУГЛЫЕ СКОБКИ

Мы можем закончить эту часть синтаксического анализатора добавив
поддержку круглых скобок. Как вы знаете, скобки являются механизмом
принудительного изменения приоритета операторов. Так, например, в выражении
2*(3+4) ,
скобки заставляют выполнять сложение перед умножением. Но, что гораздо
более важно, скобки дают нам механизм для определения выражений любой
степени сложности, как, например
(1+2)/((3+4)+(5-6))
Ключом к встраиванию скобок в наш синтаксический анализатор является
понимание того, что не зависимо от того, как сложно выражение, заключенное в
скобки, для остальной части мира оно выглядит как простой показатель. Это
одна из форм для показателя:
::= ()
Здесь появляется рекурсия. Выражение может содержать показатель,
который содержит другое выражение, которое содержит показатель и т.д. до
бесконечности.
Сложно это или нет, мы должны позаботиться об этом, добавив несколько
строчек в процедуру Factor:

{-}
{ Parse and Translate a Math Factor }
procedure Expression; Forward;
procedure Factor;
begin
if Look = '(' then begin
Match('(');
Expression;
Match(')');
end
else
EmitLn('MOVE #' + GetNum + ',D0');