Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

3.6 Диаграммы переходов

В качестве промежуточного шага при создании лексического анализатора можно рассматривать стилизованные блок-схемы, называемые диаграммами переходов. Диаграмма переходов изображает действия, выполняемые лексическим анализатором при вызове его синтаксическим анализатором для получения очередной лексемы. Позиции в диаграмме переходов изображаются кружками и называются состояниями. Состояния соединены стрелками, называемыми дугами. Выходящие из состояния s дуги имеют метки, указывающие входные символы, которые могут появиться во входном потоке по достижении состояния s. Метка other означает появление любого символа, не указанного другими исходящими дугами.

Диаграммы переходов в данном случае детерминированные, т.е. ни один символ не может быть меткой двух исходящих из одного состояния дуг. Одно из состояний имеет метку startэто начальное состояние диаграммы переходов в момент начала распознавания лексемы. Некоторые состояния имеют действия, выполняемые при достижении этих состояний. При попадании в некоторое состояние считывается следующий входной символ и, если имеется исходящая дуга с меткой, соответствующей этому символу, перемещаемся по ней в следующее состояние. Если такой дуги нет, то входящий символ некорректен и произошла ошибка.

На рис. 9 показана диаграмма переходов для шаблонов >= и >. Диаграмма работает следующим образом. Работа начинается в состоянии 0, в котором считывается следующий символ из входного потока. Дуга, помеченная >, ведет в состояние 6, если этот символ – “>”. В противном случае мы не можем распознать > или >=.

Рис. 9. Диаграмма перехода для >=

По достижении состояния 6 считываем следующий входной символ. Дуга, помеченная как =, приводит из состояния 6 в состояние 7, если считанный символ – “=”. В противном случае по дуге other попадаем в состояние 8. Двойной кружок, который изображает состояние 7, показывает, что это – заключительное состояние, в котором найдена лексема >=.

Символ > с другим дополнительным символом приводит в другое допускаемое состояние 8. Поскольку этот другой символ не является частью лексемы, он должен быть возвращен во входной поток, что и указано звёздочкой около этого состояния.

Вообще говоря, может существовать ряд диаграмм переходов, каждая из которых определяет группу лексем. Если при перемещении по диаграмме переходов происходит сбой, осуществляется возврат к тому месту, где он был в стартовом состоянии данной диаграммы, и переходим к следующей диаграмме.

Пример 7

Диаграмма переходов для лексемы relop показана на рис. 10. Диаграмма на рис. 9 представляет собой часть этой более сложной диаграммы переходов.

Рис. 10. Диаграмма переходов для операторов отношения

Пример 8

Поскольку ключевые слова есть не что иное, как последовательности букв, они представляют собой исключение из правила, гласящего, что последовательность букв и цифр, начинающаяся с буквы, является идентификатором. Но вместо кодирования исключений в диаграмме переходов можно рассматривать ключевые слова как специальные идентификаторы. Тогда по достижении заключительного состояния на рис. 11 выполняется некоторый код, который определяет, чем является лексема, приведшая в это состояние, - ключевым словом или идентификатором.

Рис.11. Диаграмма переходов для идентификаторов и ключевых слов

Простейшая технология отделения ключевых слов от идентификаторов состоит в соответствующей инициализации таблицы символов, в которой хранится информация об идентификаторах. Для лексем if, then и else надо внести в таблицу символов строки if, then и else до начала работы с входным потоком. При распознавании такой строки возвращается лексема ключевого слова. Программа проверяет таблицу символов и, если лексема найдена в ней и помечена как ключевое слово, возвращается указатель на запись в таблице символов, в противном случае возвращается лексема id.