- •Московский автомобильно-дорожный государственный технический университет (мади)
- •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. Оптимизация кода
I.14. Цепочки вывода
I.14.1. Понятие о выводе
Выводом называется процесс порождения предложения языка на основе правил, определяющих язык грамматики. Используются такие понятия
β = δ1 γ δ2 – называется непосредственно выводимой из цепочки
α = δ1 ω δ2
из грамматики G(VT,VN,P,S), V=VT ∪ VN, δ1,υ, δ2 ∈ V* > ω ∈ V+
в ней существует правило
ω → υ ∈ P
Непосредственная выводимость цепочки β из цепочки α обозначается
α ⇒β
При выводе выполняется подстановка по цепочке γ вместо подцепочки ω, β –выводима из цепочки α в том случае, если можно взять несколько символов в цепочке α, заменить их на другие символы, согласно некоторому правилу грамматики и получить цепочку β. При непосредственной выводимости любая из цепочек δ1, δ2 может быть пустой или обе могут быть пустыми. В предельном случае цепочка α может быть заменена на цепочку β, тогда в грамматике G должно существовать правило
α ⇒β ∈ P
Цепочка β называется выводимой из цепочки α (α ⇒*β) в том случае, если выполняется одно из двух условий:
β – непосредственно выводимая из α (α ⇒β)
γ - непосредственно выводимая из β (γ ⇒β)
∃ γ такая, что γ , выводимая из α и β , - непосредственно выводимая
γ ⇒α
β ⇒*γ
Суть в том, что β выводимая из цепочки α (α ⇒β) или если можно построить последующие непосредственные цепочки из α ⇒β
В этой последовательности каждая последующая цепочка υi непосредственно выводима из предыдущей цепочки υi-1 .
Такая последовательность непосредственно выводимых цепочек называется выводом или цепочкой вывода. Каждый переход от одной непосредственно выводимой цепочки к следующей цепочке вывода называется шагом вывода. Если цепочка β выводится непосредственно из цепочки α, имеется один шаг вывода. Если цепочка от α к β имеет несколько промежуточных цепочек, она имеет специальное обозначение
α ⇒ +β
Если число шагов вывода известно, то его можно непосредственно указать в знаках выводимости цепочек
α ⇒4 β (цепочка β выводится из цепочки α за 4 шага вывода)
Пример
G({0,1,…,9,-,+},{S,T,F},P,S)
P:
S→ |+T|-T
T→F | TF
F→0|…|9
Построим несколько произвольных цепочек вывода
S⇒-T⇒-TF⇒-TFF⇒-FFF⇒-4FF⇒-47F⇒-479
S⇒T⇒TF⇒T8⇒F8 ⇒18
T⇒TF⇒T0⇒TF0⇒T50⇒F50⇒350
TFT⇒TFFT⇒TFFF⇒FFFF⇒1FFF⇒1FF4⇒-10F4 ⇒1004
F ⇒5
Результат
S ⇒* 479 или S ⇒ + - 479 или S ⇒7 -479
S ⇒* 18 или S ⇒+18 или S ⇒518
T ⇒* 350 или T ⇒ -250 или T ⇒6 350
T ⇒* 1004 или TFT ⇒+1004 или TFT ⇒7 1004
F ⇒* 5 или F 15
Выводы построены на основе грамматики G. Можно построить сколько угодно цепочек вывода.
Пример 2
G3(a,b,c),{B,C,D,S},P3}
P3
B→ aBbC|ab
Cb→bC
CD→Dc
bDc→bcc
abD→abc
L(G3)={anbncn| n>0}
aaaabbbbcccc
S ⇒BD ⇒ aBbCD ⇒aaBbCbCD ⇒ aaaBbCbCbCD ⇒aaaabbCbCbCD⇒ aaaabbbCCbCD ⇒
⇒aaaabbbCbCCD ⇒ aaaabbbbCCCD ⇒aaaabbbbCCDc ⇒ aaaabbbbCDcc ⇒ aaaabbbbDccc ⇒
⇒ aaaabbbbcccc
Тогда для грамматики G3 получили вывод
S⇒* aaaabbbbcccc
I.14.2. Сентенциальная форма грамматики
Вывод называется законченным, если на основе цепочки β, полученной в результате вывода нельзя больше сделать ни одного шага вывода, иначе говоря, вывод называется законченным, если цепочка β, полученная в результате вывода пустая или содержит только терминальные символы грамматики.
G(VT,VN,P,S) (β ∈ VT* )
Цепочка β, полученная в результате вывода называется конечной цепочкой вывода. В рассмотренном ранее примере все построенные выводы являются законченными, а вывод S
S ⇒* -4FF из первой цепочки будет не законченным
Цепочка α ∈ V* называется сентенциальной формой грамматики
G(VT,VN,P,S),V=VT ∪ VN , если она выводима из целевого символа S ⇒* α
Если цепочка α ∈ VT * получена в результате законченного вывода,то она называется конечной сентенциальной формой. Из рассмотренного примера, можно заключить, что -479,18 являются конечными сен. Формами грамматики целых десятичных чисел со знаком, т.к. в примере существуют выводы
S ⇒* - 479 (1)
S ⇒* 18 (2)
Цепочка F8 из вывода (2) тоже является с.ф., поскольку справедливо соотношение S ⇒* F8, но она не является конечной цепочкой вывода. В тоже время в примерах 3,4,5 вывода присутствует с.ф.
Цепочки 350,1004,5 тоже являются конечными с.ф. Чтобы доказать это нужно построить другие цепочки вывода.
Для цепочки 5 S ⇒ T ⇒ F ⇒5 получается вывод S ⇒* 5
Для цепочки TFT(4) не выводима из целевого символа грамматики S, поэтому с.ф. не является.
Язык L, заданный грамматикой G(VT,VN,P,S) это множество всех конечных с.форм грамматики G и обозначается L(G). Алфавитом такого языка будет множество символов грамматики VT, т.к. все конечные с.ф. грамматики – это цепочки алфавита VT.
Две грамматики G(VT,VN,P,S) и G’(VT’,VN’,P’,S’) называются эквивалентными, если эквивалентны заданные ими языки
L(G)=L’(G’)
Эквивалентные грамматики должны иметь пересекающее множество терминальных символов
VT ⋂VT’ ≠0 и часто они совпадают VT=VT’, а множество нетерминальных символов, правила гр. и целевой символ у них могут отличаться.
