- Лекция 1
- Структура языка
- Компилятор
- Грамматики
- Df Порождающая грамматика
- Df Слово $\sigma$ непосредственно выводится из слова $\gamma$ в грамматике $G = \left(\Sigma, \Gamma, P, S\right)$
- Df Слово $\sigma$ выводится из слова $\gamma$ в грамматике $G = \left(\Sigma, \Gamma, P, S\right)$
- Пример грамматики и непосредственной выводимости
- Df Язык, порождаемый $G$
- Пример построения грамматики для заданного порождаемого языка
- Первый способ
- Второй способ
- Иерархия Хомского-Шютценберже$_{кек}$
Лекция 1
13.01.2020
Структура языка
- Лексика — словарный запас языка
- Синтаксис — правила построения “фраз” языка
- Семантика — смысловая функция из текста в смысл
Компилятор
Компилятор работает в два этапа:
- Анализ
- Обязательный этап
- Frontend
- Синтез
- Необязательная часть (например Excel вычисляет все еще на этапе анализа)
- Backend
- Здесь проводятся оптимизации и вычисления
Этапы подробнее:
$\dashv$ Исходный текст (поток символов) $\mapsto$ Анализатор лексики $\dashv$ синтаксическое дерево $\mapsto$ Синтаксический анализ $\dashv$ лексемы-токены-слова $\mapsto$ Cемантический анализатор $\dashv$ аннотированное дерево $\mapsto$ …
Каждый этап взаимодействует с таблицей символов. Цель первых трех этапов — проверка ошибок и преобразование-анализ текста.
Грамматики
Очень важные определения
Df Порождающая грамматика
$G = \left(\Sigma, \Gamma, P, S\right)$, где
- $\Sigma$ — основной (терминальный) алфавит
- $\Gamma$ — вспомогательный алфавит
- — множество правил вывода
- $S \in \Gamma$ — аксиома
Обозначения:
- Символы терминального алфавита — первые буквы латиницы в нижнем регистре, цифры, иногда символы пунктуации: $a, b, c,…, 1, 2, 3,…$
- Символы вспомогательного алфавита — первые буквы латиницы в верхнем регистре: $A, B, C…$
- Слова над $\Sigma^*$ — последние буквы латиницы в нижнем регистре: $x, y, z,…$
- $\lambda$ — пустое слово
Правило вывода — функция, которая показывает, какое слово можно получить из какого, например $aAa \rightarrow bb$. В левой части обязательно должен быть хотя бы один символ из вспомогательного алфавита $\Gamma$.
Df Слово $\sigma$ непосредственно выводится из слова $\gamma$ в грамматике $G = \left(\Sigma, \Gamma, P, S\right)$
Это определение можно транзитивно и рефлексивно замкнуть:
Df Слово $\sigma$ выводится из слова $\gamma$ в грамматике $G = \left(\Sigma, \Gamma, P, S\right)$
Пример грамматики и непосредственной выводимости
Так задавать грамматики сложно и громоздко, к тому же во многих правилах одинаковой левой части соответствуют разные правые, поэтому будем обозначать грамматики как только множества правил, а для правил обозначим: —
Df Язык, порождаемый $G$
Множество всех слов над $\Sigma^*$, выводимых в $G$ из $S$
Пример построения грамматики для заданного порождаемого языка
Хотим получить такой язык:
где ${\mid w \mid}_a$ — количество символов $a$ в слове $w$
Первый способ
$G_1$:
Второй способ
$G_2$:
Видно, что грамматики $G_1$ и $G_2$ порождают одинаковые языки, но они сильно отличаются по сложности: во втором в левой части правил вывода встречаются сложные выражения, что все только усложняет. Такие грамматики не совсем хороши для нас.
Иерархия Хомского-Шютценберже$_{кек}$
| Класс грамматик | Класс языков | Распознаватель |
|---|---|---|
| Все грамматики | Рекурсивные перечисления | Машина Тьюринга |
| Контекстно-зависимые грамматики ( $\alpha A\beta \rightarrow \alpha\gamma\beta$ ) | Контекстно-зависимые языки | Linear-Bounded Automata |
| Контекстно-свободные грамматики ( $ A \rightarrow \gamma $ ) | Контекстно-свободные языки | Машина Тьюринга с магазинной памятью |
| Праволинейные грамматики ( $ A \rightarrow aB, A \rightarrow \lambda $ ) | Регулярные языки | ДКА |