
170
11. Пересмотр лексического анализа
ВВЕДЕНИЕ
У меня есть хорошие и плохие новости. Плохие новости - эта глава не та, которую я
вам обещал последний раз. Более того, и следующая глава также.
Хорошие новости в причине появления этой главы: я нашел способ упростить и
улучшить лексический анализатор компилятора. Позвольте мне объяснить.
ПРЕДПОСЫЛКА
Если вы помните, мы подробно говорили на тему лексических анализаторов в Главе 7
и я оставил вас с проектом распределенного сканера который, я чувствовал, был почти
настолько простым, насколько я cмог сделать... более чем большинство из того, что я где-
либо видел. Мы использовали эту идею в Главе 10. Полученная структура компилятора
была простой и она делала свою работу.
Однако недавно я начал испытывать проблемы такого рода, которые подсказывают,
что возможно вы делаете что-то неправильно.
Проблемы достигли критической стадии когда я попытался обратиться к вопросу точек
с запятой. Некоторые люди спрашивали меня, действительно ли KISS будет
использовать их для разделения операторов. Я не намеревался использовать точки с
запятой просто потому, что они мне не нравятся и, как вы можете видеть, они не доказали
своей необходимости.
Но я знаю, что многие из вас, как и я, привыкли к ним, так что я намеревался написать
короткую главу чтобы показать вам, как легко они могут быть добавлены раз вы так
склонны к ним.
Чтож, оказалось что их совсем непросто добавить. Фактически это было чрезвычайно
трудно.
Я полагаю, что должен был понять что что-то было неправильно из-за проблемы
переносов строк. В последних двух главах мы обращались к этому вопросу и я показал
вам, как работать с переносами с помощью процедуры, названной достаточно
соответствующе NewLine. В TINY Version 1.0 я расставил вызовы этой процедуры в
стратегических местах кода.
Кажется, что всякий раз, когда я обращался к проблеме переносов, я, однако, находил
этот вопрос сложным и полученный синтаксически анализатор оказывался очень
ненадежным... одно удаление или добавление здесь или там и все разваливалось.
Оглядываясь назад, я понимаю, что это было предупреждение, на которое я просто не
обращал внимания.
Когда я попробовал добавить точку с запятой к переносам строк это стало последней
каплей. Я получил слишком сложное решение. Я начал понимать, что необходимо что-то
менять коренным образом.
Итак, в некотором отношении эта глава заставить нас возвратиться немного назад и
пересмотреть заново вопрос лексического анализа. Сожалею об этом. Это цена, которую
вы платите за возможность следить за мной в режиме реального времени. Но новая
версия определенно усовершенствована и хорошо послужит нам дальше.
Как я сказал, сканер использованный нами в Главе 10, был почти настолько простым,
насколько возможно. Но все может быть улучшено. Новый сканер более похож на
классический сканер и не так прост как прежде. Но общая структура компилятора даже
проще чем раньше. Она также более надежная и проще для добавления и/или
модификации. Я думаю, что она стоит времени, потраченного на это отклонение. Так что