
- •1/ Какая функция называется булевой? Как связаны булевы функции и формулы алгебры логики?
- •2/ Сформулировать тезис Чёрча- Тьюринга.
- •3/ Какие математические модели алгоритма Вы знаете?
- •4/ Из чего состоит машина Тьюринга? Как она работает?
- •5/ Как определяется словарная функция f? в каком случае мы говорим, что машина
- •37.Машины Тьюринга как словарные функции.
- •8/ В чем заключается проблема остановки машины Тьюринга. Является ли она алгоритмически разрешимой?
- •9/ Как определяется временная сложность алгоритма?
- •10/ Что означает выражение «Задача решается за реальное время»?
- •11/ Какие задачи попадают в класс p? Какие задачи попадают в класс np? Как эти классы связаны между собой? (p-np – проблема).
- •Перечислите основные типы грамматик по классификации Хомского. Какому типу соответствуют алгоритмические языки?
- •Что такое регулярные (автоматные) грамматики? Какие типы распознающих устройств используются для распознавания регулярных грамматик?
- •Какая модель представления знаний называется продукционной? в чем ее достоинства и недостатки?
- •В чем состоит задача синтаксического анализа? Что такое синтаксические деревья? Каким образом они строятся?
- •Какие две основные стратегии синтаксического разбора вы знаете? в чем состоит основная проблема разбора?
- •2/ Какие базовые понятия лежат в основе ооп?
- •6/ Поясните такие понятия объектно-ориентированного программирования как класс, объект класса.
- •7/ Что такое наследование классов? Простое и множественное наследования.
- •8/ Инкапсуляция. Что дает инкапсуляция?
- •9/ Определите понятие конструктора класса.
- •10/ Полиморфизм. Примеры реализации полиморфизма.
В чем состоит задача синтаксического анализа? Что такое синтаксические деревья? Каким образом они строятся?
Задача, решаемая синтаксическим анализатором
Синтаксический анализатор должен распознать структуру предложения, а именно синтаксические зависимости слов. В результате должно быть либо построено синтаксическое дерево, либо выявлены составляющие. Обычно грамматика строится так, чтобы на выходе получалось синтаксическое дерево, позволяющее выполнять разнообразные трансформации лексического содержания с пересогласованием зависимых слов, а также легко выделять семантику, в частности - применять алгоритм взвешивания альтернативных вариантов построения дерева, о котором речь пойдет ниже.
Предложение может допускать несколько альтернативных вариантов связывания слов. В этом случае анализатор пытается применять некоторые эвристики и базу знаний, но может в конце концов вернуть несколько вариантов синтаксического дерева. К такому поведению особенно склонен восходящий парсер, так как он сильно ограничен в средствах по пресечению экспоненциального роста числа вариантов. Наличие нескольких итоговых вариантов разбора может означать не только недостаточный набор правил в языковой модели, но и присущую данному предложению неоднозначность, устраняемую только учетом более широкого контекста.
Анализируемые предложения могут иметь разную сложность, включать неизвестные слова или отступления от нормативного синтаксиса. Чтобы эффективно справляться с разными задачами, синтаксический анализатор применяет несколько разных алгоритмов, включая структурный нисходящий анализ и восходящий анализ, а также применяет семантический анализ для уточнения результатов в случае неоднозначностей.
=======
синтакси́ческий ана́лиз (жарг. па́рсинг) — это процесс сопоставления линейной последовательности лексем (слов, токенов) естественного или формального языка с его формальной грамматикой. Результатом обычно является дерево разбора (синтаксическое дерево). Обычно применяется совместно с лексическим анализом. Синтаксический анализатор (парсер) — это программа или часть программы, выполняющая синтаксический анализ.
Пример разбора выражения в дерево
При парсинге исходный текст преобразуется в структуру данных, обычно — в дерево, которое отражает синтаксическую структуру входной последовательности и хорошо подходит для дальнейшей обработки.
Как правило, результатом синтаксического анализа является синтаксическая структура предложения, представленная либо в виде дерева зависимостей, либо в виде дерева составляющих, либо в виде некоторой комбинации первого и второго способов представления.
Результат грамматического анализа. Дерево разбора отличается от абстрактного синтаксического дерева наличием узлов для тех синтаксических правил, которые не влияют на семантику программы. Классическим примером таких узлов являются группирующие скобки, в то время как в AST группировка операндов явно задаётся структурой дерева.
Определение:
Деревом разбора грамматики называется дерево, в вершинах которого записаны терминалы или нетерминалы, а дети вершины, в которой записан нетерминал, соответствуют раскрытию нетерминала по одному любому правилу, в левой части которого стоит этот нетерминал, и упорядочены так же, как в правой части этого правила. Все вершины, помеченные терминалами, являются листьями. Все вершины, помеченные нетерминалами, имеют детей.
Определение:
Кроной дерева разбора называется множество терминальных символов, упорядоченное в соответствии с номерами их достижения при обходе дерева в глубину из корня.
Крона дерева разбора представляет из себя слово языка, которое выводит это дерево.
Рассмотрим, как будет выглядеть дерево разбора нашей скобочной последовательности.
В синтаксическом дереве внутренние узлы (вершины) соответствуют операциям, а листья представляют собой операнды. Как правило, листья синтаксического дерена сляпаны с записями в таблице идентификаторов. Структура синтаксического дерева отражает синтаксис языка программирования, на котором наш капа исходная программа.
Синтаксические деревья могут быть построены компилятором для любой части входной программы. Не всегда синтаксическому дереву должен соответствовать фрагмент кода результирующей программы — например, возможно построение синтаксических деревьев для декларативной части языка. В этом случае операции, имеющиеся в дереве, не требуют порождения объектного кода, но несут информацию о действиях, которые должен выполнить сам компилятор над соответствующими элементами. В том случае, когда синтаксическому дереву соответствует некоторая последовательность операций, влекущая порождение фрагмента объектного кода, говорят о дереве операций.
Дерево операций можно непосредственно построить из дерева вывода, порожденного синтаксическим анализатором. Для этого достаточно исключить из дерева вывода цепочки нетерминальных символов, а также узлы, не несущие семантической нагрузки при генерации кода. Примером таких узлов могут служить различные скобки, которые меняют порядок выполнения операции и операторов, но после построения дерева никакой смысловой нагрузки не несут, гак каким не соответствует никакой объектным код.
То, какой узел в дерене является операцией, а какой — операндом, никак невозможно определить из грамматики, описывающей синтаксис входного языка. Также ниоткуда не следует, каким операциям должен соответствовать объектный код в результирующей программе, а каким — нет. Все это определяется только исходя из семантики — «смысла» — языка входной программы. Поэтому только разработчик компилятора может четко определить, как при построении дерева операции должны различаться операнды и сами операции, а также то, какие операции являются семантически незначащими для порождения объектного кода.
Алгоритм преобразования дерева семантического разбора и дерево операции можно представить следующим образом.
Шаг 1. Если в дереве больше не содержится узлов, помеченных нетерминальными символами, то выполнение алгоритма завершено; иначе — перейти к шагу 2
Шаг. 2. Выбрать крайний левый узел дерена, помеченный нетерминальным символом грамматики и сделать его текущим. Перейти к шагу 3.
Шаг 3. Если текущий узел имеет только один нижележащий узел, то текущий узел необходимо удалить из дерена, а связанный с ним узел присоединить к узлу вышележащего уровня (исключить из дерена цепочку) и вернуться к шагу 1; иначе – перейти к шагу 4.
Шаг 4. Если текущий узел имеет нижележащий узел (лист дерева), помеченный терминальным символом, который не несет семантической нагрузки, тогда этот лист нужно удалить из дерева и вернуться к шагу 3; иначе — перейти к шагу 5.
Шаг 5. Если текущий узел имеет один нижележащий узел (лист дерева), помеченный терминальным символом, обозначающим знак операции, а остальные узлы помечены как операнды, то лист, помеченный знаком операции, надо удалить из дерева, текущий узел пометить этим знаком операции и перейти к шагу 1; иначе — перейти к шагу 6.
Шаг 6. Если среди нижележащих узлов для текущего узла есть узлы, помеченные нетерминальными символами грамматики, то необходимо выбрать крайний левый среди этих узлов, сделать его текущим умом и перейти к шагу 3: иначе — выполнение алгоритма завершено.