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

{ Recognize an Addop }
function IsAddop(c: char): boolean;
begin
IsAddop := c in ['+', '-'];
end;
{-}

ОК, внесите эти изменения в программу и повторно откомпилируйте. Вы
должны также включить IsAddop в базовую копию программы Cradle. Она
потребуется нам позже. Сейчас попробуйте снова ввести -1. Вау! Эффективность
полученного кода довольно плохая... шесть строк кода только для того, чтобы
загрузить простую константу... но, по крайней мере, правильно работает.
Запомните, мы не пытаемся сделать замену Turbo Pascal.
На данном этапе мы почти завершили создание структуры нашего
синтаксического анализатора выражений. Эта версия программы должна правильно
распознавать и компилировать почти любое выражение, которое вы ей подсунете.
Она все еще ограничена тем, что поддерживает показатели состоящие только из
одной цифры. Но я надеюсь что теперь вы начинаете понимать, что мы можем
расширять возможности синтаксического анализатора делая незначительные
изменения. Вы возможно даже не будете удивлены, когда услышите, что
переменная или даже вызов функции это просто один из видов показателя.
В следующей главе я покажу, как можно легко расширить наш
синтаксический анализатор для поддержки всех этих возможностей, и я также
покажу как легко мы можем добавить многосимвольные числа и имена переменных.
Итак, вы видите, что мы совсем недалеко от действительно полезного
синтаксического анализатора.

СЛОВО ОБ ОПТИМИЗАЦИИ

Раннее в этой главе я обещал дать несколько подсказок как мы можем
повысить качество генерируемого кода. Как я сказал, получение компактного
кода не является главной целью этой книги. Но вам нужно по крайней мере
знать, что мы не зря проводим свое время... что мы действительно можем
модифицировать анализатор для получения лучшего кода не выбрасывая то, что
мы уже сделали к настоящему времени. Обычно небольшая оптимизация не слишком
трудна... просто в синтаксический анализатор вставляется дополнительный код.
Существуют два основных метода, которые мы можем использовать:
Попытаться исправить код после того, как он сгенерирован.
Это понятие "щелевой" оптимизации. Основная идея в том, что известно
какие комбинации инструкций компилятор собирается произвести и также
известно которые из них "плохие" (такие как код для числа -1). Итак, все что
нужно сделать - просканировать полученный код, найти такие комбинации
инструкций и заменить их на более "хорошие". Это вид макрорасширений
наоборот и прямой пример метода сопоставления с образцом. Единственная
сложность в том, что может существовать множество таких комбинаций. Этот
метод называется "щелевой" оптимизацией просто потому, что оптимизатор
работает с маленькой группой инструкций. "Щелевая" оптимизация может
драматически влиять на качество кода и не требует при этом больших изменений
в структуре компилятора. Но все же за это приходится платить скоростью,
размером и сложностью компилятора. Поиск всех комбинаций требует проверки