![](/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-средства. Направления интеллектуализации.
42 Языки логического программирования. Способы реализации.
PROLOG. Является декларативным языком программирования.
Есть операторы присваивания и управляющие операторы, декларативная семантика, это значит, что для какой-то семантической конструкции можно сказать, что она делает (и не надо смотреть код выше или ниже).
Обзор логического программирования
Языки, используемые для логического программирования, называются декларативными языками, поскольку программы, написанные на них, состоят из объявлений, а не из операторов присваивания и управляющих операторов. Эти объявления в действительности являются операторами, или высказываниями, в символьной логике.
Существенной характеристикой языков логического программирования является их семантика, называемая декларативной семантикой (declarative semantics). Декларативная семантика значительно проще, чем семантика императивных языков. Смысл заданного высказывания в языке логического программирования можно точно определить по самому оператору. В императивном языке семантика простого оператора присваивания требует проверки локальных объявлений, знания правил обзора данных в языке, а также, возможно, проверки программ, записанных в других файлах всего лишь для определения типов переменных в операторе присваивания. Если выражение присваивания содержит переменные, должно быть отслежено выполнение программы до оператора присваивания для того, чтобы определить значения этих переменных. Сравнивая это с простой проверкой отдельного оператора, не требующей рассмотрения контекста или последовательности выполнения программы, легко видеть, что декларативная семантика намного проще, чем семантика императивных языков.
Программирование как на императивных, так и на функциональных языках в основном является процедурным. Это означает, что программист знает, что именно должно быть выполнено программой, и указывает компьютеру, как именно следует выполнять вычисления. Компьютер рассматривается как простое устройство, подчиняющееся приказам. Все, что подлежит вычислению, должно сопровождаться подробным описанием вычислений.
Программирование на некоторых неимперативных языках и, в частности, на языках логического программирования, является непроцедурным. Программы на таких языках не содержат указаний, как именно вычислить результат, а только описывают форму результата.
Применение логического программирования
Системы управления реляционными базами данных
Экспертные системы
Системы обработки естественных языков
Образование
43 Графовые грамматики. Назначение и основные понятия.
Алфавит: G = < T, N, S, P > - линейная граматика
T – Терминалы
N – Не терминалы
S – Начальный символ (один из не терминалов)
P – Правила
Графовую граматику можно свести к линейной.
Узлы с одинаковыми именами являются одним узлом. Возможность изображать один узел несколько раз, дает удобство представления графов.
T = { O, ->, □, --> }*
N = { ◊, -.-> }*
( где ‘=’ – включение, ‘+’ - дизъюнкция)
44 Antlr. Tree grammars.
ANTLR — Another Tool For Language Recognition — генератор парсеров, позволяющий автоматически создавать программу-парсер(как и лексический анализатор) на одном из целевых языков программирования(С++, Java, C#, Python, Ruby) по описанию LL-грамматики на языке, близком к EBNF.
Абстрактное синтаксическое дерево — это конечное, помеченное, ориентированное дерево, в котором внутренние вершины сопоставлены с операторами языка программирования, а листья с соответствующими операндами. Таким образом, листья являются пустыми операторами и представляют только переменные и константы. Синтаксические деревья используются в парсерах для промежуточного представления программы между деревом разбора (конкретным синтаксическим деревом) и структурой данных, которая затем используется в качестве внутреннего представления компилятора или интерпретатора компьютерной программы для оптимизации и генерации кода. Возможные варианты подобных структур описываются абстрактным синтаксисом. Абстрактное синтаксическое дерево отличается от дерева разбора тем, что в нём отсутствуют узлы и рёбра для тех синтаксических правил, которые не влияют на семантику программы. Классическим примером такого отсутствия являются группирующие скобки, так как в АСД группировка операндов явно задаётся структурой дерева.
Tree grammar: преимущество использования
Программисты, разрабатывающие транслятор, как правило, сталкиваются с вопросом: «Что делать с АСД после того, как оно составлено?» Как правило, первым решением возникшей проблемы является использование visitor-шаблона, который позволяет организовать глубокий проход по дереву, выполняя методы каждой вершины. Хотя данный вариант и прост для понимания, такой подход эффективен только для простейших трансляторов. Он не делает проверку структуры дерева, и различного рода действия можно производить только над текущей вершиной, т.к. об остальной структуре дерева ничего не известно.
Следующим шагом является написание проходчика по дереву (tree walker), который будет вручную проверять структуру дерева. Walker владеет информацией о структуре благодаря использованию глобальных переменных или получает эту информацию во время прохода по дереву. Однако вместо ручного написания tree walker-а гораздно правильнее использовать tree grammar, т.к. для выполнения каких-либо операций с определёнными поддеревьями необходимо просто ввести эти действия в грамматике, правильно их расположив.
После того, как составлена грамматика, строящая АС деревья, необходимо составить одну или несколько tree-грамматик для извлечения информации, использования дополнительных структур или генерации трансляции. Tree-грамматика имеет аналогичную вводную часть:
Правила в tree-грамматиках идентичны правилам в parser-грамматиках с той лишь разницей, что они точно определяют соответствующий элемент дерева. Имеют следующий синтаксис:
После преамбулы идёт описание деревьев, составленное parser-грамматикой. AST rewrite rules – это порождающие (генеративные) грамматики, которые описывают деревья, которые составляет parser-грамматика. Для составления tree-грамматики можно повторно использовать rewrite rules parser-грамматики. Простейшим способом составления tree-грамматики является метод «копирования / вставки» parser-грамматики в tree-грамматику с последующим удалением компонентов parser-грамматики (оставляя только rewrite rules данной грамматики).
Если во время исполнения parser rule решает, какую древовидную структуру строить, то в tree-грамматике подобных проблем не возникает: деревом обязательно будет одна из предложенных альтернатив. К примеру, следующая грамматика:
Так как АСД операторы являются немного более сложными, следует использовать AST rewrite rules везде, где это только возможно.
! - оператор обычно транслируется напрямую, так как данный элемент можно просто оставить за пределами tree-грамматики. К примеру, в следующем правиле знак « ; » не представлен в tree-грамматике:
45 Языковые процессоры. Назначение и структура.