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

7.4.6 Алгоритм синтаксического анализа простого предшествования

Каждый такт работы анализатора начинается с определения отношения предшествования, которое выполняется для пары, образованной из верхнего символа стека и крайнего левого символа входной строки.

Возможны следующие варианты.

  1. Ни одно из отношений не определено. Тогда входная цепочка отвергается.

2) Для пары символов определено отношение <• или , тогда выполняется перенос.

При переносе анализатор записывает символ <• в стек, если соответствующее отношение выполняется для данной пары, после чего переносит в стек левый символ входной цепочки. Во входной цепочке осуществляется сдвиг (переход) к следующему символу.

3) Для пары определено отношение >, тогда выполняется свертка.

При выполнении свертки, анализатор работает следующим образом.

3.1 Просматривает символы в стеке, пока не обнаружит символ <•. Выделяет подцепочку, состоящую из просмотренных символов ( без знака <•). Снимает со стека найденные символы.

3.2 Ищет правило вывода грамматики, правая часть которого совпадает с подцепочкой, выделенной на предыдущем шаге. Если такое правило найдено, переход к следующему шагу, иначе – к последнему шагу 4.

3.3 Исключает из стека найденные на первом шаге подцепочку и символ <• . В итоге образуется пара, состоящая из символа на верхушке стека и нетерминального символа из левой части продукции, найденной на шаге 3.2.

3.4 Ищет отношение предшествования, выполняющееся для пары, образованной на предыдущем шаге ( это только <• или ) .

Если ни одно отношение предшествования не выполнено, входная цепочка отвергается.

В противном случае в стек записывается символ <• , если для пары выполнено данное отношение, и символ из левой части продукции. На этом свертка заканчивается.

4) Анализируются цепочки, записанные в стеке и на входной ленте. Если в стеке находится цепочка $ <• S, где S – стартовый символ грамматики, а на входной ленте только маркер конца строки $, то входная цепочка принимается ( допускается). В противном случае – цепочка отвергается.

7.4.7 Алгоритм синтаксического анализа приоритета операторов

Алгоритм аналогичен рассмотренному ранее в п. 7.4.6.

Разница состоит в том, что отношения приоритетов рассматриваются только между терминальными символами грамматики.

При выполнении свертки с вершины стека выбираются все терминальные символы, связанные отношением , совместно с окружающими их нетерминалами.

Так как нетерминальные символы не играют роли в определении отношений между терминалами, можно заменить все нетерминалы одним символом.

    1. LR-анализаторы

LR- технология наиболее эффективная технология восходящего синтаксического анализа, которая может быть использована для анализа большого класса контекстно-свободных грамматик. Эта технология называется LR(k)-анализ; L означает сканирова­ние входного потока слева направо, R — построение обращенных правых порождений, а k — число входных символов, которые могут быть просмотрены для принятия решения о способе проведения разбора. Если (k) не указывается, подразумевается, что k равно 1. LR-анализ привлекателен по следующим причинам.

  • LR-анализаторы могут быть созданы для распознавания, по сути, всех конструкций языков программирования, для которых может быть написана контекстно-свободная грамматика.

  • Метод LR-анализа — наиболее общий известный метод ПС-анализа без отката, который, кроме того, не уступает в эффективности другим методам этого типа.

  • Класс грамматик, которые могут быть разобраны с использованием LR-метода представляет собой собственное надмножество класса грамматик, которые могут быть разобраны предиктивными синтаксическими анализаторами.

  • LR-анализатор может обнаруживать синтаксические ошибки сразу же, как только это становится возможным при сканировании входного потока.

Основной недостаток этого метода состоит в том, что ручное построение LR анализатора для грамматики типичного языка программирования требует большого объема работы. Для решения этой задачи нужен специализированный инструмент — генератор LR-анализаторов. С помощью такого генератора для разработанной контекстно-свободной грамматики можно автоматически построить ее синтаксический анализатор. Если грамматика содержит неоднозначности или другие конструкции, трудные для разбора сканированием слева направо, генератор в состоянии их локализовать и сообщить о них разработчику.