"Джек Креншоу. Давайте создадим компилятор! " - читать интересную книгу автора 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. Вывод: код, генерируемый нашим синтаксическим анализатором, менее эффективный, чем код, написанный вручную. Привыкните к этому. Это в известной мере относится ко всем компиляторам. Ученые посвятили целые жизни вопросу оптимизации кода и существуют методы, призванные улучшить качество генерируемого кода. Некоторые компиляторы выполняют оптимизацию достаточно хорошо, но за это приходится платить сложностью и в любом случае это |
|
|