![](/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-средства. Направления интеллектуализации.
18 Slr-анализаторы. Построение таблиц для slr-анализатора.
Сейчас мы покажем, каким образом можно построить таблицу LR-анализа для данной грамматики. Мы представим три метода, разные по мощности и сложности реализации. Первый метод — "простого LR" (simple LR, SLR) — самый слабый из них по количеству грамматик, с которыми он работает, однако самый простой в реализации. Таблицу, построенную таким методом, будем называть SLR-таблицей, а синтаксический анализатор, работающий с SLR-таблицей, — SLR-анализатором (а соответствующую грамматику — SLR-грамматикой). Два других метода добавляют к SLR-методу просмотр входного потока.
LR
(0)-пункт,
или элемент
(далее для краткости – просто пункт)
грамматики
G
- продукция G
с точкой в некоторой позиции правой
части. Следовательно, продукция
дает четыре пункта:
Продукция
генерирует
только один пункт,
.
Пункт
может быть представлен парой целых
чисел, первое из которых представляет
номер продукции, а второе — позицию
точки. Интуитивно пункт указывает, какую
часть продукции мы уже увидели в данной
точке в процессе синтаксического
анализа. Например, первый пункт,
приведенный выше, определяет, что во
входном потоке мы ожидаем встретить
строку, порождаемую XYZ.
Второй
пункт указывает, что у нас уже есть
строка, порожденная X,
и
мы ожидаем получить из входного потока
строку, порождаемую YZ.
Основная идея SLR-метода состоит в том, чтобы вначале построить на базе грамматики детерминированный конечный автомат для распознавания активных префиксов. Мы группируем пункты в множества, которые приводят к состояниям SLR-анализатора. Пункты могут рассматриваться как состояния недетерминированного конечного автомата, распознающего активные префиксы.
Система LR(0)-пунктов, которую назовем канонической, обеспечивает основу для построения SLR-анализаторов. Для построения канонической LR(0)-системы грамматики мы определим расширенную грамматику и две функции — closure и goto.
Если
G
– грамматика со стартовым символом S,
то
расширенная грамматика грамматикиG,
представляет собой G
с новым стартовым символом S'
и продукцией
.
Назначение этой новой стартовой продукции
— указать синтаксическому анализатору,
когда он должен прекратить разбор и
объявить о допущении входной строки.
Таким образом, допуск строки происходит
тогда и только тогда, когда синтаксический
анализатор выполняет свертку,
соответствующую продукции
.
Операция замыкания
Если I — множество пунктов грамматики G, то closure(I) — множество пунктов, построенное из I по следующим правилам.
1. Изначально в closure(I) входят все пункты из I
2.
Если
входит вclosure(I)
и
представляет собой продукцию, то
добавляем вclosure(I)
пункт
(если его там еще нет). Мы применяем это
правило до тех пор, пока не внесем все
возможные пункты вclosure(I).
Наличиевclosure(I)
указывает, что в некоторый момент в
процессе синтаксического анализа мы
полагаем, что можем встретить во входном
потоке подстроку, выводимую из
.
Но если имеется продукция
,
то, естественно, мы также можем встретить
в этот момент строку, выводимую из у,
поэтому включаем
вclosure(I).
Теперь покажем, как построить функции action и goto SLR-анализа по детерминированному конечному автомату, распознающему активные префиксы. Наш алгоритм не дает однозначно определенные таблицы действий синтаксического анализа для всех грамматик, но он успешно работает для многих грамматик языков программирования. Данную нам грамматику G расширяем до грамматики G', и на основе G' строим С — каноническую систему множеств пунктов для G'. По системе С мы строим action, функцию действий синтаксического анализа, и goto, функцию переходов, в соответствии с приведенным далее алгоритмом. Он требует знания FOLLOW(A) для каждого нетерминала А грамматики.
если
Ii
и goto(Ii,
a)=Ij,
то
определить action[i,
а] как
"перенос j";
здесь
а
должно
быть терминалом;
если
Ii
то определить action[i,
а] как
"свертка
"
для всеха
из
FOLLOW(A),
здесь А
не
должно быть S’;
если
Ii,
то определить action[i,
$]
как "допуск".
Если по этим правилам генерируются конфликтующие действия, мы говорим, что грамматика не является SLR(l). Алгоритм не в состоянии построить синтаксический анализатор для нее.
Переходы goto для состояния i и всех нетерминалов А строятся по правилу: если goto(Ii, A)=Ij, то goto[i, A]=j.
Все записи, не определенные по правилам (2) и (3), указываются как "ошибка".
Начальное
состояние синтаксического анализатора
представляет собой состояние, построенное
из множества пунктов, содержащего
.