Лекция 1

13.01.2020

Структура языка

  1. Лексика — словарный запас языка
  2. Синтаксис — правила построения “фраз” языка
  3. Семантика — смысловая функция из текста в смысл

Компилятор

Компилятор работает в два этапа:

  1. Анализ
    • Обязательный этап
    • Frontend
  2. Синтез
    • Необязательная часть (например Excel вычисляет все еще на этапе анализа)
    • Backend
    • Здесь проводятся оптимизации и вычисления

Этапы подробнее:

$\dashv$ Исходный текст (поток символов) $\mapsto$ Анализатор лексики $\dashv$ синтаксическое дерево $\mapsto$ Синтаксический анализ $\dashv$ лексемы-токены-слова $\mapsto$ Cемантический анализатор $\dashv$ аннотированное дерево $\mapsto$ …

Каждый этап взаимодействует с таблицей символов. Цель первых трех этапов — проверка ошибок и преобразование-анализ текста.

Грамматики

Очень важные определения

Df Порождающая грамматика

$G = \left(\Sigma, \Gamma, P, S\right)$, где

Обозначения:

Правило вывода — функция, которая показывает, какое слово можно получить из какого, например $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 $ ) Регулярные языки ДКА