![](/user_photo/1549_7W_y5.jpg)
- •1 Общая модель компилятора. Блоки компилятора и их функции
- •2 Общее понятие синтаксиса и семантики языка. Бнф и др. Методы описания синтаксиса и семантики языка.
- •3 Понятие языка. Способы задания языка. Операции над языком
- •4 Регулярные выражения. Способы задания регулярных выражений. Операции над регулярными выражениями.
- •5.Конечные автоматы. Способы задания. Методы построения конечных автоматов. Преобразование конечных автоматов.
- •6 Лексический анализ. Методы и средства построения лексического анализатора.
- •7 Распознавание цепочек символов с помощью конечных автоматов.
- •8 Распознавание цепочек символов с помощью автоматов с магазинной памятью.
- •9 Грамматики языков. Классификация языков по Хомскому.
- •11 Методы представления грамматики в памяти.
- •12 Нисходящий синтаксический анализ. Метод рекурсивного разбора.
- •14 Нисходящий синтаксический анализ. Методы восстановления после ошибок.
- •16 Синтаксический анализ приоритета операторов. Функция приоритета
- •18 Slr-анализаторы. Построение таблиц для slr-анализатора.
- •19 Методы анализа ошибок. Восстановление после ошибок.
- •20 Семантика языка, методы описания и анализа.
- •21 Понятие атрибутивные грамматики
- •22 Синтаксически управляемая трансляция.
- •23 Таблица символов, таблица меток и др. Методы построения, доступа и анализа.
- •24 Генерация промежуточного кода.
- •25 Методы оптимизация промежуточного кода.
- •29 Имена, связывание, проверка типов.
- •30 Область видимости имен. Способы реализации.
- •31 Типы данных. Способы реализации.
- •32 Выражения и операторы присваивания. Способы реализации.
- •36. Абстрактные типы данных. Способы реализации.
- •37 Объектно-ориентированные языки программирования. Способы реализации.
- •38 Обработка исключительных ситуаций. Способы реализации.
- •39 Языки параллельного программирования. Способы реализации.
- •40 Императивные языки программирования. Способы реализации.
- •41 Функциональные языки программирования. Способы реализации.
- •42 Языки логического программирования. Способы реализации.
- •43 Графовые грамматики. Назначение и основные понятия.
- •44 Antlr. Tree grammars.
- •46 Case-средства. Назначение, классификация и основные понятия.
- •47 Case-средства. Направления интеллектуализации.
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 анализатор не будет.