Конструирование Компиляторов, Определения
Материал из eSyr's wiki.
- Авторы рукописной версии: Синдеев Михаил (оригинал), Комаров Сергей (обработка)
- Обработанная рукописная версия: http://www.komserg.ru/botva/konstr.rar
Язык
Язык — множество цепочек.
Грамматика
Грамматика — G = (N, T, P, S)
- N — множество нетерминальных символов (A, B, C)
- T (иногда E) — алфавит терминальных символов
- P — множество правил вывода
- P = {α → β | α ∈ (N ∪ T)* N (N ∪ T)*, B ∈ (N ∪ T)* }
- S ∈ N — аксиома
Сентенциальная форма
Сентенциальная форма — последовательность символов (терминалов и нетерминалов), выводимых из аксиомы
Язык, порождённый грамматикой
Язык, порождённый грамматикой — L(G) = {W | W ∈ T*, S ⇒+ W}
Язык, порождённый грамматикой — множество всех терминальных цепочек, выводимых из аксиомы грамматики
Иерархия по Хомскому
- 0: произвольные грамматики
- 1: неукорачивающие (контекстно-зависимые) грамматики
- α → β, |α| ≤ |β|
- допускается S → ε, если S не входит ни в какую правую часть
- 2: контекстно-свободные
- A → α, α ∈ (N ∪ T)*
- 3: праволинейные (A → w, A → wB, w ∈ T*), леволинейные (A → w, A → Bw, w ∈ T*),
Из определения следует, что Z0 ⊇ Z1 ⊇ Z2 ⊇ Z3.
Существует теорема, которая доказывает, что Z0 ⊃ Z1 ⊃ Z2 ⊃ Z3.
Машина Тьюринга
Машина Тьюринга — Tm = (Q, Г, Σ, D, q0, F)
- Q — конечное множество состояний
- Г — конечное множество символов (конечный алфавит)
- Σ — входной алфавит
- D — правила перехода
- D: (Q\F) × Г → Q × Г × {L, R} — для детерминированной машины Тьюринга
- D: (Q\F) × Г → 2Q × Г × {L, R} — для недетерминированной машины Тьюринга
- q0 ∈ Q — начальное состояние
- F ⊆ Q — множество конечных состояний
Универсальная машина Тьюринга
Универсальная машина Тьюринга — такая машина Тьюринга, которая моделирует любую машину Тьюринга.
Рекурсивно-перечислимый язык
Язык является рекурсивно-перечислимым, если он может быть распознан машиной Тьюринга.
Линейно-ограниченный автомат
Линейно-ограниченный автомат — это машина Тьюринга, которая не может выходить за область входной строки.
Лемма о разрастании
Если язык L — регулярный, то ∃ k: ∀ w ∈ L, |w| ≥ k | w = xyz, 0 &l; |y| ≤ k, xyiz ∈ L, ∀ i ≥ 0
Неоднозначная грамматика
Грамматика называется неоднозначной, если для некоторой цепочки существует хотя бы два дерева вывода.
Левосторонний вывод
Левосторонний вывод — такой вывод, на каждом шаге которого заменяется самый левый нетерминал.
Магазинный автомат
Магазинный автомат — M = (Q, T, Г, D, q0, z0, F)
- Q — конечное множество состояний
- T — конечный входной алфавит
- Г — конечный алфавит магазинных символов
- D — D: Q × (T ∪ {ε}) × Г → 2Q × Г*
- q0 ∈ Q — начальное состояние
- z0 — начальный символ магазина
- F ⊆ Q — множество конечных состояний
Расширенный магазинный автомат
Расширенный магазинный автомат — M = (Q, T, Г, D, q0, z0, F)
- Q — конечное множество состояний
- T — конечный входной алфавит
- Г — конечный алфавит магазинных символов
- D — D: Q × (T ∪ {ε}) × Г* → 2Q × Г*
- q0 ∈ Q — начальное состояние
- z0 — начальный символ магазина
- F ⊆ Q — множество конечных состояний
Грамматика в нормальной форме Хомского
Грамматика находится в нормальной форме Хомского, если правила вывода имеют вид:
- A → BC; B, C ∈ N
- A → a
- S → ε (если ε ∈ L; S не входит ни в одну правую часть)
Лемма о разрастании (для контекстно-свободного языка)
Для любого контекстно-свободного языка L ∃ l, k: α ∈ L, |α| > l, α = uvwxy
- |vwx| ≤ k
- vx ≠ ε
- uviwxiy ∈ L, ∀ i
Недостижимый символ
x — недостижимый символ, если он не входит ни в одну сентенциальную форму.
x — недостижимый символ, если не существует вывода S ⇒* αxβ
Непорождающий символ
x — непорождающий символ, если из него нельзя вывести терминальную цепочку
x — непорождающий символ, если из не существует вывода x ⇒* w, w ∈ T*
Бесполезный символ
Бесполезный символ — недостижимый или непорождающий символ.
Приведённая грамматика
Грамматика называется приведённой, если она не содержит бесполезных символов.
Регулярное множество
Регулярное множество в алфавите T определяется следующим образом:
- {} (пустое множество) — регулярное множество в алфавите T
- {a} — регулярное множество в алфавите T для каждого a ∈ T
- {ε} — регулярное множество в алфавите T
- Если P и Q — регулярные множества в алфавите T, то таковы же и множества
- P ∪ Q (объединение)
- PQ (конкатенация, то есть множество таких pq, что p ∈ P, q ∈ Q)
- P* (итерация: P* = {ε} ∪ P ∪ PP ∪ PPP ∪ …)
- Ничто друге не является регулярным множеством в алфавите T
Регулярное выражение
Регулярное выражение — форма записи регулярного множества.
Длина пути от листа к корню
Длиной пути от листа к корню называется число вершин в этом пути, считая сам лист (то есть, <число дуг> + 1)
Высота дерева
Высота дерева — максимальная длина пути (по всем терминальным символам).
Множество FIRST(u)
Если u — любая строка символов грамматики, положим FIRST(u) — множество терминалов, с которых начинаются строки, выводимые из u. Если u ⇒* ε, то ε так же принадлежит FIRST(u).
Множество FOLLOW(A)
Пусть A — нетерминал. Тогда FOLLOW(A) — множество терминалов a, которые могут появиться непосредственно справа от A в некоторой сентенциальной форме, то есть, множество терминалов a таких, что существует вывод вида S ⇒* uAav для некоторых u и v.
Множество FIRST1
FIRST1 — множество всех терминальных символов, с которых может начинаться цепочка терминальных символов, выводимых из цели грамматики или ε, если u ⇒* ε.
Пример:
- S → aS | A
- A → b | bSd | bA | ε
- FIRST1 = {a, b, ε}
Основа сентенциальной формы
Основа сентенциальной формы — позиция в сентенциальной форме, которая заменена в следующей сентенциальной форме.
Множество FIRST(A)
Множество FIRST(A) — множество терминальных символов,которыми начинаются цепочки, выводимые из A в грамматике G = (VT, VN, P, S), то есть, FIRST(A) = {a ∈ VT | A ⇒ aα, A ∈ VN, α ∈ (VT ∪ VN)*}
Множество FOLLOW(A)
Множество FOLLOW(A) — множество терминальных символов, которые следуют за цепочками, выводимыми из A в грамматике G = (VT, VN, P, S), то есть, FOLLOW(A) = {a ∈ VT | S ⇒ αAβ, β → aγ, A ∈ VN, α, β, γ ∈ (VT ∪ VN)*}
Леворекурсивная грамматика
Грамматика называется леворекурсивной, если в ней имеется нетерминал A такой, что существует вывод A ⇒ Au для некоторой строки u.
LL(1) грамматика
Контекстно-свободная грамматика называется LL(1) грамматикой тогда и только тогда, когда выполняются следующие два условия:
- Для каждого нетерминала, являющегося левой частью нескольких правил:
< A > → α1 | α2 | … | αn
необходимо, чтобы пересечение множеств FIRST(αi) и FIRST(αj) было пусто для всех i ≠ j - Для каждого аннулирующего нетерминала < A > ⇒ *$ необходимо, чтобы пересечение FIRST(A) и FOLLOW(A) было пустым
'Грамматика, для которой таблицы анализа не имеют неоднозначно определённых входов, называются LL(1).
LR грамматика
Грамматика, для которой можно построить таблицу LR разбора, называется LR грамматикой.
Конфигурация LR анализатора
Конфигурация LR анализатора — пара, первая компонента которой —содержимое стека, вторая — непросмотренный вход:
(S0 X1 S1 X2 S2 … Xm Sm, Ai Ai + 1 … An $).
Эта конфигурация соответствует правой сентенциальной форме X1 X2 … Xm Ai Ai + 1 … An.
Атрибутная грамматика
Атрибутной грамматикой называется четвёрка AG = (G, AS, AI, R), где
- G = (N, T, P, S) — приведённая контекстно-свободная грамматика
- AS — конечное множество синтезируемых элементов
- AI — конечное множество наследуемых атрибутов, AS ∩ AI = ∅
- R — конечное множество семантических правил
Основа сентенциальной формы
Подцепочка сентенциальной формы, которая может быть сопоставлена правой части некоторого правила вывода, свертка по которому к левой части правила соответствует одному шагу в обращении правостороннего вывода, называется основой цепочки.
Пролог подпрограммы
Пролог подпрограммы — инициализация стека для подпрограммы (то есть, это PUSH BP, MOV BP, SP и подобное)
Дисплей
Дисплей — это массив, i-й элемент которого представляет собой указатель на область активации процедуры i-го статического уровня.
Статическая цепочка
Статическая цепочка — список, в который связаны все статические контексты.
Динамическая цепочка
Динамическая цепочка — «база» динамически предыдущей процедуры.
P.S. это скорее объяснение, нежели определение.