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