- •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-средства. Направления интеллектуализации.
8 Распознавание цепочек символов с помощью автоматов с магазинной памятью.
Магазинные автоматы, известные также как автоматы с магазинной памятью или как МП-автоматы, формально определяются следующим образом.
Определение. Конфигурацией МП-автомата P называется тройка (q, ω, α), гдеq – текущее состояние управляющего устройства, ω – неиспользованная часть входной цепочки (если ω=ε, то считается, что вся входная цепочка прочитана), α – содержимое магазина (самый левый символ цепочки α считается верхним символом магазина; если α=ε, то магазин считается пустым).
На каждом шаге работы МП-автомат может либо занести что-то в магазин, либо снять какие-то значения с его вершины. Отметим, что МП-автомат может продолжать работать в случае окончания входной цепочки, но не может продолжать работу в случае опустошения магазина.
9 Грамматики языков. Классификация языков по Хомскому.
Каждая конструкция, которая может быть описана регулярным выражением, может быть описана и грамматикой.
Каждый язык программирования имеет правила, которые предписывают синтаксическую структуру корректных программ. Синтаксис конструкций языка программирования может быть описан с помощью контекстно-свободных грамматик или нотации БНФ. Грамматика дает точную и при этом простую для понимания синтаксическую спецификацию языка программирования.
Для некоторых классов грамматик мы можем автоматически построить эффективный синтаксический анализатор, который определяет, корректна ли структура исходной программы.
Правильно построенная грамматика придает языку программирования структуру, которая способствует облегчению трансляции исходной программы в объектный код и выявлению ошибок. Для преобразования описаний трансляции, основанных на грамматике языка, в рабочие программы имеется соответствующий программный инструментарий.
Существует 4 типа грамматик языка (по Холмскому):
регулярные множества (A ->xB, A->x);A – не терминал, х – терминал (AT, xN)
G = <T, N, P, S>T – терминал,N – не терминал,P – правило,S – начальное правило
контекстно-свободные грамматики (КС-грамматики)
A->U*, UT,N
контекстно-зависимые грамматики
V+-> U*, |V+| |U*|
грамматики без ограничений – грамматики, которые нельзя записать регулярными множествами
10 Контекстно-свободные грамматики. Преобразование КС-грамматик.
Контекстно-свободная грамматика состоит из терминалов, нетерминалов, стартового символа и продукций.
Терминалы представляют собой базовые символы, из которых формируются строки. Слово "токен" является синонимом слова "терминал", когда мы говорим о грамматиках языков программирования.
Нетерминалы представляют собой синтаксические переменные, которые обозначают множества строк. Нетерминалы определяют множества строк, которые помогают в определении языка, порождаемого грамматикой. Кроме того, они налагают на язык иерархическую структуру, облегчающую синтаксический анализ и трансляцию. Один из нетерминалов грамматики считается стартовым символом, и множество строк, которые он обозначает, является языком, определяемым грамматикой.
Продукции грамматики определяют способ, которым терминалы и нетерминалы могут объединяться для создания строк. Каждая продукция состоит из нетерминала, за которым следует стрелка (или символ : : =), и строка нетерминалов и терминалов.
Свойства КС – грамматик:
рекурсивность грамматики:
левая рекурсивность при A -> AB*
правая рекурсивность при A -> B*A
грамматика с -правилами (при наличии )
факторизация грамматики:
левая при A -> aB* и B -> aC*
правая при A -> B*a и B -> C*a
Дерево разбора может рассматриваться как графическое представление порождения, из которого удалена информация о порядке замещения. Каждый внутренний узел дерева разбора помечается некоторым нетерминалом A, а дочерние узлы слева направо – символами из правой части продукции, использованной в порождении для замены А. Листья дерева разбора помечены нетерминалами или терминалами и, будучи прочитаны слева направо, образуют сентенциальную форму, называемую кроной, или границей дерева.
Для того чтобы увидеть взаимосвязь между порождением и деревьями разбора, рассмотрим любое приведение а1 => а2 =>… => аn, где аi— отдельный нетерминал А. Для каждой сентенциальной формы а, в приведении строим дерево разбора, результатом которого является аi. Этот процесс представляет собой индукцию по i. Базисом служит дерево для а1= А. которое представляет собой единственный узел, помеченный как A. Для выполнения индукции предположим, что мы уже построили дерево разбора, имеющее крону аi-1 = X1X2...Xk (вспомним, что Xi может означать терминал или нетерминал). Предположим, что аi-1, порождает аi , заменой нетерминала Xj на β = Y1Y2... Yr. Таким образом на i-ом шаге порождения к аi-1 применяется продукция Xj → β порождая a = X1 X2... Xj-1 β Xj+1...Xk.
Для моделирования этого шага находим j-й слева лист в текущем дереве разбора, который помечен Xj. Мы даем этому листу r дочерних узлов, помеченных Y1,Y2,...,Yr слева направо. В специальном случае r = 0, т.е. β =ε , у j-го листа появляется один дочерний узел, помеченный ε.