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

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 Языковые процессоры. Назначение и структура.