Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры [4747 вопросов].doc
Скачиваний:
83
Добавлен:
15.06.2014
Размер:
407.04 Кб
Скачать

16 Синтаксический анализ приоритета операторов. Функция приоритета

Самый широкий класс грамматик, для которых успешно строятся ПС-анализаторы. Однако для небольшого, но важного класса грамматик мы легко можем построить эффективные ПС-анализаторы вручную. У этих грамматик нет продукций, правые части которых представляют собой ε или имеют два соседних нетерминала. Грамматика при наличии последнего свойства называется операторной (operator grammar).

Применяется для операторных грамматик.

Не должно быть рядом стоящих терминалов.

Для учета приоритета операций три отношения:

<∙, ∙>, = (над множеством терминалов)

a <∙ b – а уступает приоритет b

a ∙> b – а забирает приоритет у b

А = b – a имеет тот же приоритет что и b.

Использование отношений приоритетов операторов

Цель отношений приоритетов состоит в определении границ основы правосентенциальной формы: <• отмечает ее левый конец, •> — правый, а = находится внутри основы. Чтобы быть более точными, предположим, что у нас есть правосентенциальная форма операторной грамматики. Из того, что у продукции не может быть двух смежных нетер­миналов в правой части, следует, что и правосентенцианьная форма не может иметь двух смежных нетерминалов. Таким образом, мы можем записать правосентенциальную фор­му в виде β0 а1 β1 …аn βn где каждое β1 является либо ε. (пустой строкой), либо одиночным нетерминалом, а каждое а1представляет собой одиночный терминал.

На практике применяются функции приоритета.

f(a) > g(b) <=> a ∙> b

Компиляторы, использующие синтаксические анализаторы приоритета операторов, не нуждаются в хранении таблицы отношений приоритетов. В большинстве случаев таблица может быть закодирована двумя функциями приоритетов f и g, отображающими терминальные символы в целые числа. Мы пытаемся выбрать f и g такими что для символов а и b

таким образом, отношение приоритетов между a и b можно определить сравне­нием числовых значений f(a) и g(b). Заметим, однако, что при этом теряется смысл пустых ячеек таблицы, информирующих об ошибке, поскольку всегда выполняется одно из трех приведенных условий, независимо от того, чему равны f(a) и g(b). По­теря возможности обнаружения ошибок, вообще говоря, не считается достаточно серьезной, чтобы отказаться от использования функций приоритета там, где это возможно; ошибки могут быть обнаружены при вызове процедуры свертки для не­обнаруженной основы.

Не всякая таблица отношений приоритетов имеет функции приоритета для ее кодиро­вания, но обычно на практике эти функции существуют.

17 LR-анализаторы. LR-грамматики. Методы восстановления после ошибок.

LR(1)-анализатор использует для принятия решения один символ входной цепочки. Алгоритм построения управляющей таблицы LR(1)-анализатора подобен уже рассмотренному алгоритму для LR (0)-анализатора, но понятие ситуации в LR(1)-анализаторе более сложное: LR(1)-ситуация состоит из правила грамматики, позиции правой части (представляемой точкой) и одного символа входной строки (lookahead symbol). LR(1)-ситуация выглядит следующим образом: [A→w1 . w2 , a], где a – терминальный символ. Ситуация [A→w1 .w2, a] означает, что цепочка w1 находится на вершине магазина, и префикс входной цепочки выводим из цепочки w2 x. Как и прежде, состояние автомата определяется множеством ситуаций. Для построения управляющей таблицы необходимо переопределить базовые операции closure и goto.

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

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

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

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

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

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

После обсуждения работы LR-анализатора познакомимся с тремя методами построения таблицы LR-анализа для грамматики. Первый метод, простой LR (simple LR. SLR), является самым легким в реализации, но наименее мощным из них. Он не может построить таблицу разбора для некоторых грамматик, которые успешно обрабатываются дру­гими методами. Второй метод— канонический LR — наиболее мощный, но требующий наибольших ресурсов. Третий метод, метод LR с предпросмотром (lookahead LR, или LALR), по мощности и требуемым ресурсам занимает промежуточное положение. Метод LALR работает с большинством грамматик и может быть эффективно реализован. В этом разделе мы рассмотрим некоторые методы сжатия таблиц LR-анализа.

Таким образом, LALR анализатор имеет значительное преимущество в размере таблиц по сравнению с LR. Однако, существуют грамматики, которые можно обработать LR анализатором, но нельзя LALR анализатором. LALR анализатор будет считать их неоднозначными, а LR анализатор не будет.