- •Формальные грамматики и языки.
- •Задача разбора
- •Классификация грамматик по Холмскому.
- •Диаграмма состояний
- •Отношения предшествования
- •Распознаватель
- •Матрица предшествования
- •Некоторые приемы приведения к грамматикам простого предшествования.
- •Представление автоматов.
- •Концевые маркеры и выходы из распознавания.
- •Эквивалентность состояний.
- •Проверка эквивалентности двух состояний.
- •Недостижимые состояния.
- •Алгоритм составления списка достижимых состояний.
- •Приведённые автоматы.
- •Получение минимального автомата.
- •Недетерминированные автоматы.
- •Эквивалентность недетерминированных и детерминированных конечных распознавателей (нкр и дкр).
- •Задание:
- •Транслятор.
- •Введение таблицы символов.
- •Включение неявной информации.
- •Обнаружение ошибок.
- •Макрообработка и операции, выполняемые во время компиляции.
- •Синтез объектной программы.
- •Оптимизация.
- •Генерация кода.
- •Редактирование связей и загрузки.
- •Задача идентификации. Реализация ка при работе трансляторов.
- •Хранение информации о лексемах.
- •Механизм запоминания.
- •Метод хеширования.
- •Нисходящий разбор с возвратами.
- •Начальная установка.
- •Новый человек.
- •Неудача
- •Класс грамматик, допускающих нисходящий распознаватель.
- •Статистические управляемые схемы перевода и атрибутные грамматики.
- •Контекстные условия
Некоторые приемы приведения к грамматикам простого предшествования.
Грамматика для списков (которые очень часто встречаются): переменные, параметры, индексы.
<L>→λ
<L>→a<R>
<R>→, a<R>
<R>→λ
Предположим, что некоторая грамматика содержит такие 2 правила:
<S>→ if <B> then <S1>
<S>→ if <B> then <S1> else <S2>
Эта грамматика не может быть LL(1) грамматикой, т.к. if содержится во множествах выбора обоих правил. При построении LL(1) грамматик важно, чтобы конструкции языка, начинающиеся с одинаковых символов, порождались одним общим для них правилом. Для рассматриваемого примера можно получить.
<S>→ if <B> then <S1><нечто>
<нечто>→ else <S2>|λ
Про такие правила говорят, что они получены из первоначальных двух методом «левой факторизации».
Грамматика с леворекурсивным нетерминалом не может быть LL(1) грамматикой. Грамматику с левой рекурсией всегда можно представить в грамматику без левой рекурсии. Основная идея состоит в том, чтобы смотреть на рекурсивный нетерминал как на порождающий некоторую цепочку, за которой следует список из одного или более элементов.
Например: <S>→<S>a
<S>→b
Трактуем нетерминал <S> как порождающий символ b, за которым следует список из нуля или символов a.
<A>→b<список>
<список>→a <список>|λ
Если приведенное выше правило преобразования объединить с заменой края, то его можно использовать для исключения леворекурсивности, даже когданекоторые леворекурсивные правила не являются самолеворекурсивными.
1.A→a<B>
2.A→ab
A→a<B><список>
A→abc<список>
A→<A>cb
<B>→ <A>b
<B>→d
<список>→cb<список>|λ
<B>→<A>
<B>→d
(Замена края:
Для правил
<A>→α1
…
<A>→αn
<B>→ β<A>γ
<B>→βα1γ
…
<B>→ βαnγ )
Исключение λ-правил
Пусть есть две разновидности нетерминала А: <Ада>(с λ-правилами) и <Анет>
<S>→a<A><S> <S>→a<Анет><S>
<S>→b <S>→a<Ада><S>
<A>→c<S> <S>→b
<A>→λ <Aнет>→c<S>
<Aда>→λ(однозначное правило, которое можно исключить)
<S>→a<Анет><S>
<S>→a<S>
<S>→b
<Aнет>→c<S>
Можно опять перейти к нетерминалу A,но из него уже не выводима пустая цепочка.
<S>→a<A><S>
<S>→a<S>
<S>→b
<A>→c<S>
Общие правила в методике исключение λ-правил:
Определить, какие нетерминалы грамматики могут порождать пустую цепочку
Заменить каждое из правил, правые части которых содержат хотя бы по одному аннулирующему нетерминалу, множеством новых правил.
Исключить из грамматики все λ-правила, включая те, которые могли появиться на шаге 2.
Представление автоматов.
Один из удобных способов представления КА – таблица переходов. КА с состояниями S1,…,Sn и входными литерами Т1,…,Тn можно представить в виде матрицы В, состоящей из nxm элементов. Элемент B[i,j] содержит число k – номер состояния Sk, такое что M[Si,Tj]=Sk. Можно условиться, что состояние S1 – начальное, а список заключённых состояний представлен вектором
Такая матрица называется матрицей переходов, т.к. она указывает, каким образом происходит переключение из одного состояние в другое.
Другим способом представления может быть списочная структура. Представление каждого состояния с k дугами, исходящими из него, занимает 2k+2 слов. Первое слово – имя состояния, второе – значение k. Каждая последующая пара слов содержит терминальный символ из входного алфавита и указатель на начало представления состояния, в которое надо перейти по этому символу.
