
- •Московский автомобильно-дорожный государственный технический университет (мади)
- •I.Формальные языки и грамматики
- •I.1. Цепочки символов
- •I.2. Операции над цепочками символов
- •I.3. Понятие языка
- •I.4. Способы задания языка
- •I.5. Синтаксис и семантика языка
- •I.6. Определение грамматики
- •I.7. Пример грамматики
- •I.8. Принцип рекурсии в правилах грамматики
- •I.9. Способы задания грамматик
- •I.9.1. Использование метасимволов
- •I.9.2. Запись правил грамматики в графическом виде
- •I.10. Распознаватель
- •I.10.1. Схема распознавателя
- •I.10.2. Задача разбора
- •I.11. Классификация грамматик
- •I.12. Классификация языков
- •I.13. Примеры классификаций языков и грамматик
- •I.14. Цепочки вывода
- •I.14.1. Понятие о выводе
- •I.14.2. Сентенциальная форма грамматики
- •I.14.3. Левосторонние и правосторонние выводы
- •I.14.4. Дерево вывода и методы его построения
- •I.15. Однозначности и эквивалентности грамматик
- •I.15.1. Однозначные и неоднозначные грамматики
- •I.15.2. Проверка однозначной и эквивалентной грамматик
- •I.15.3. Правила, задающие неоднозначность в грамматиках
- •II. Принципы построения трансляторов
- •II.1. Определения транслятора
- •II.2. Определение компилятора
- •II.3. Определения интерпретатора
- •II.4. Этапы трансляции
- •II.5. Фазы компиляции
- •II.6. Ти ( таблицы идентификаторов)
- •II.6.1. Назначение и особенности построения
- •II.6.2. Простейшие методы
- •II.6.3. Построение ти по методу бинарного дерева
- •II.6.5. Выбор Хэш-функции при построении ти
- •II.6.7. Построение ти по методу цепочек
- •II.7. Лексические анализаторы
- •II.7.1. Назначение ла
- •II.7.2. Определение границ лексем
- •II.7.3. Выполнение действий, связанных с лексемами
- •II.7.4. Применение конечных автоматов (ка) для построения ла
- •II.7.5. Алгоритм построения ка
- •II.7.6. Пример применения ка для построения ла
- •II.8. Принципы построения синтаксических анализаторов (са)
- •II.8.1. Значение са
- •II.8.2. Автоматы с магазинной памятью
- •II.9. Принципы построения семантического анализатора (с-а)
- •II.9.1. Назначение с-а
- •II.9.2. Проверка соблюдения во входной программе семантических соглашений
- •II.9.3. Дополнение внутреннего представления программы
- •II.9.4. Проверка смысловых норм языка программирования
- •II.10. Принципы генерации кода
- •II.11. Оптимизация кода
II.7.2. Определение границ лексем
Язык констант и идентификаторов является регулярным, т.е. может быть описан с помощью регулярных грамматик. Распознавателем является КА (конечный автомат), поэтому основой для реализации являются КА. Существуют правила, при которых может быть построен КА, распознающий цепочки языка, заданного данной грамматикой. Он для каждой входной цепочки языка определяет, принадлежит ли она языку, заданному автоматом. Кроме того, он выполняет следующие действия:
определяет границы лексем, которые в тексте исходной программы не указаны;
выполняет действия для сохранения информации о обнаруженной лексеме и выдает сообщение об ошибке, если она не верна.
II.7.3. Выполнение действий, связанных с лексемами
В большинстве компиляторов ЛА и СА – это взаимосвязанные части. Для организации взаимосвязи применяют два метода – это последовательный и параллельный. При 1ом ЛА просматривает весь текст исходной программы от начала до конца и преобразует его в ТЛ, которая заполняется сразу полностью. Компилятор использует ее для следующих фаз компиляции, не изменяя ее. Если в процессе разбора он не смог правильно определить тип лексемы, то считается, что исходная программа содержит ошибку. При параллельном варианте ЛА текста исходной программы выполняется поэтапно (по шагам). Он выделяет лексему в коде и передает ее в СА. СА, выполнив разбор конструкции языка может подтвердить правильность найденной лексемы и обратиться к ЛА за следующей лексемой либо отвергнуть найденную лексему. В этом случае он может проинформировать ЛА о том, что надо вернуться назад, к уже рассмотренному ранее элементу исходного кода и сообщить ему дополнительную информацию о том, какого типа лексему следует ожидать. В взаимодействии между собой, они могут перебрать несколько возможных вариантов лексем и если ни один из них не подойдет, будет считаться, что исходная программа содержит ошибку. Только после того, как СА успешно выполнит разбор очередной конструкции исходного языка, ЛА помещает лексему в ЛА и в ТИ и продолжается разбор в том же порядке.
Их последовательная работа – это самый простой вариант взаимодействия. Она обеспечивает скорость работы компилятора, чем их параллельное взаимодействие.
II.7.4. Применение конечных автоматов (ка) для построения ла
Конечным автоматом называют
M( Q, V, δ , q0 ,F ), где
Q – конечное множество состояний автомата
V – конечное множество допустимых входных сигналов (алфавит автомата)
δ – функция перехода, отображающая V*Q( декартовое произведение множеств во множестве подмножеств)
Q: R(Q), т.е.
δ ( a,q)=R, a ∈ V, q ∈ Q,
R ≤ Q
q0 - начальное состояние автомата
q0 ∈ Q
F – непустое множество конечных состояний автомата
F ≤Q, F 0
II.7.5. Алгоритм построения ка
Построение КА M( Q, V, δ , q0 ,F ) на основе автоматной леволинейной грамматики G(VT,VN,P,S) выполняется по следующему алгоритму:
строят множество состояний автомата Q таким образом, чтобы каждому нетерминальному символу из множества VN данной грамматики G соответствовало одно состояние из множества Q автомата M. В множество состояний автомата добавляется одно дополнительное состояние, обозначаемое H. Сохраняя обозначение нетерминальных символов гр. G для множества состояний M можно записать Q=VN ∪{H}
входным алфавитом автомата М является множество терминальных символов гр. G V=VT.
просмотрев всё множество правил исходной программы, если встречается правило вида
A → t ∈P, где A∈ VN, t ∈VT, то функция переходов δ (H,t) добавляют состояние A и
получают A ∈ δ(H,t). Если встречается правило вида A →B t ∈P, где A,B∈ VN, t ∈VT, то в функцию перехода δ (B,t) автомата М добавляется состояние A: A ∈ δ(B,t).
начальное состояние автомата М является состоянием Н
H: q0 = H
множество конечных состояний автомата М состоит из 1 состояния, которое соответствует целевому символу гр. G
G:F={S}
На этом построение автомата заканчивается.