SlideShare una empresa de Scribd logo
1 de 16
Практическое занятие 17.
Контекстно-свободные
грамматики
1.
2.
3.
4.

Теоретические сведения
Контрольные вопросы
Указания по выполнению заданий
Задания
Теоретические сведения
Контекстно-свободные грамматики – это объекты теории формальных
грамматик, основы которой были заложены в фундаментальных
работах Н.Хомского.
Теория формальных грамматик занимается описанием, распознаванием и
переработкой языков. Под языком, определенном на алфавите
(множестве букв или символов) A, понимается множество слов L ⊆ A*,
где A* – множество всех возможных слов (цепочек), состоящих из букв
алфавита A. Для его описания вводится грамматика, как механизм,
порождающий слова, состоящие из букв его алфавита.
Для определения контекстно-свободной грамматики (КС-грамматики),
надо:
1) указать конечное множество A, называемое алфавитом; его элементы
называют символами; конечные последовательности символов
называют словами (в данном алфавите);
2) разделить все символы алфавита A на две группы: терминальные
("окончательные") и нетерминальные ("промежуточные");
3)
выбрать среди нетерминальных символов один, называемый
начальным;
4) указать конечное число правил грамматики, каждое из которых должно
иметь вид K → X, где K – некоторый нетерминальный символ, а X –
слово (в него могут входить и терминальные, и нетерминальные
символы).
Теоретические сведения
Пусть фиксирована КС-грамматика. Выводом в этой
грамматике называется последовательность слов
X[0], X[1], ..., X[n], в которой X[0] состоит из одного
символа, и этот символ – начальный, а X[i + 1]
получается
из
X[i]
заменой
некоторого
нетерминального символа K на слово X по одному из
правил грамматики.
Слово, составленное из терминальных символов,
называется выводимым, если существует вывод,
который им кончается. Множество всех выводимых
слов (из терминальных символов) называется языком,
порождаемым данной грамматикой.
Теоретические сведения
Пример 1. Пусть задана КС-грамматика:
1) алфавит состоит из четырех терминальных символов
(, ), [, ] и одного нетерминального символа E;
2) начальный символ – символ E.
3) правила: E → (E), E → [E], E → EE, E →.
Примеры выводимых с помощью заданной грамматики
слов: пустое слово, (), ([]), ()[([])], [()[]()[]]. Примеры
невыводимых с помощью заданной грамматики слов:
(, )(, (], ([)].
Пример 2. Грамматика, порождающая тот же язык, что и
в примере 1.
1) алфавит состоит из четырех терминальных символов
(, ), [, ] и двух нетерминальных символов T и E;
2) начальный символ – символ E.
3) правила: E → , E → TE, T → (E), T → [E].
Теоретические сведения
Для каждого нетерминального символа можно рассмотреть
множество всех слов из терминальных символов, которые из
него выводятся. Каждое правило грамматики можно
рассматривать как свойство этих множеств. Покажем это на
примере только что приведенной грамматики (пример 2). Пусть
T и E – множества слов, выводимых из нетерминалов T и E
соответственно. Тогда правилам грамматики соответствуют
такие свойства:
1) E → – E содержит пустое слово;
2) E → TE – если слово A принадлежит T, а слово B принадлежит
E, то слово AB принадлежит E;
3) T → (E) – если слово A принадлежит E, то слово (A)
принадлежит T;
4) T → [E] – если слово A принадлежит E, то слово [A]
принадлежит T.
Можно доказать, что множества, задаваемые грамматикой,
являются
минимальными
среди
всех
множеств,
удовлетворяющих соответствующим свойствам.
Теоретические сведения
Пример 3. Метод рекурсивного спуска. Он базируется на применении
следующей идеи. Для каждого нетерминального символа K строится
процедура ReadK, которая в применении к любому входному слову
1) находит наибольшее начало z слова x, которое может быть началом
выводимого из K слова,
2) сообщает, является ли найденное слово z выводимым из K.
Пусть буквы поступают по одной. Имеется функция Next, дающая первый
непрочитанный символ. Ее значениями могут быть терминальные
символы, а также символ EOI, означающий, что все слово уже
прочитано. Вызов функции Next не сдвигает границы между
прочитанной и непрочитанной частью – для этого есть процедура Move,
которая сдвигает границу на один символ (она применима в том
случае, если результат Next не равен EOI). Кроме этого, пусть имеется
булевская переменная b, значением которой является либо 1
(ИСТИНА) либо 0 (ЛОЖЬ). Теперь к процедуре ReadK можно
предъявить следующие требования:
1) ReadK прочитывает из оставшейся части слова максимальное начало
A, являющееся началом некоторого слова, выводимого из K,
2) значение b становится истинным или ложным в зависимости от того,
является ли A выводимым из K или лишь невыводимым началом
выводимого из K слова.
Теоретические сведения
Пример 4. Алгоритм разбора для LL(1)-грамматик. Его идея
заключается в применении левого вывода.
Левым выводом (слова в грамматике) называется вывод, в котором на
каждом шаге замене подвергается самый левый из нетерминалов.
Можно формально доказать, что для каждого выводимого слова (из
терминалов) существует левый вывод.
Для каждого слова X из терминалов и нетерминалов через Нач(X)
обозначим множество всех терминалов, с которых начинаются
непустые слова из терминалов, выводимые из X.
Для каждого нетерминала K через Послед(K) обозначим множество
терминалов, которые встречаются в выводимых (в грамматике)
словах сразу же за K. Кроме того, в Послед(K) включается символ
EOI, если существует выводимое слово, оканчивающееся на K.
Для каждого правила K → V (где K – нетерминал, V – слово,
содержащее терминалы и нетерминалы) определим множество
направляющих терминалов, обозначаемое Напр(K → V). По
определению оно равно Нач(V), к которому добавлено Послед(K),
если из V вводится пустое слово.
Теоретические сведения
Пример 4 (продолжение).
Грамматика называется
LL(1)грамматикой, если для любых правил
K → V и K → W с
одинаковыми левыми частями множества Напр(K → V) и Напр(K →
W) не пересекаются. Для LL(1)-грамматики существует не более
одного возможного продолжения левого вывода.
Грамматика называется леворекурсивной, если из некоторого
нетерминала K выводится слово, начинающееся с K, но не
совпадающее с ним. К леворекурсивным грамматикам LL(1)-метод
неприменим – их необходимо преобразовывать к эквивалентным
LL(1)-грамматикам или применять для них другие методы
распознавания.
С учетом всего сказанного можно построить следующий алгоритм
проверки выводимости слова из терминалов в LL(1)-грамматике.
Мы следуем описанному выше методу поиска левого вывода, храня
лишь часть слова, находящуюся правее уже прочитанной части
входного слова, т.е. храним слово S
из терминалов и
нетерминалов, обладающее таким свойством (прочитанную часть
входа обозначаем через A):
Теоретические сведения
Пример 4 (продолжение).
1) слово AS выводимо в грамматике;
2) любой левый вывод входного слова проходит через стадию AS.
Эти свойства вмести будем обозначать «(И)».
Вначале A пусто, а S состоит из единственного символа – начального
нетерминала.
Если в некоторый момент S начинается на терминал t и t = Next (Next
– функция такая же, как в примере 17.3), то можно выполнить
команду Move (Move – процедура такая же, как в примере 17.3) и
удалить символ t, являющийся начальным в S, поскольку при этом
AS не меняется.
Если S начинается на терминал t и t ≠ Next, то входное слово
невыводимо – ибо по условию любой его вывод должен проходить
через AS. (Это же справедливо и в случае Next = EOI.)
Если S пусто, то из условия (И) следует, что входное слово выводимо
тогда и только тогда, когда Next = EOI.
Теоретические сведения
Пример 4 (продолжение).
Остается случай, когда S начинается с некоторого нетерминала K. По
сказанному выше все левые выводы из S слов, начинающихся на
символ Next, начинаются с применения к S одного и того же
правила – того, для которого Next принадлежит направляющему
множеству. Если таких правил нет, то входное слово невыводимо.
Если такое правило есть, то нужно применить его к первому
символу слова S – при этом свойство (И) не нарушится.
Алгоритм заканчивает работу, поскольку при появлении нетерминала
в начале слова S происходит чтение со входа или остановка, а
бесконечный цикл сменяющих друг друга терминалов в начале S
означал бы, что грамматика леворекурсивна.
Контрольные вопросы
1. Формальная грамматика.
2. КС-грамматика.
3. Вывод в КС-грамматике.
4. Выводимое (в грамматике) слово.
5. Задание множеств КС-грамматиками.
6. Метод рекурсивного спуска.
7. Левый вывод.
8. LL(1)-грамматика.
9. Леворекурсивная грамматика.
10.Алгоритм разбора для LL(1)-грамматик.
Указания по выполнению заданий
1.
2.
3.

4.

Получить задание
Выполнить задание.
Подготовить отчет по выполнению задания. Отчет
должен включать задание и описание этапов
выполнения задания.
Ответить на вопросы по выполнению задания и
контрольные вопросы
Задания
1. Построить КС-грамматику, в которой выводимы слова
1) 00..0011..11 (число нулей равно числу единиц);
2) 00..0011..11 (число нулей вдвое больше числа единиц);
3) 00..0011..11 (число нулей больше числа единиц)
и только они.
2. Доказать, что не существует КС-грамматики, в которой были бы
выводимы слова вида 00..0011..1122..22, в которых числа
нулей, единиц и двоек равны, и только они.
3. Дана произвольная КС-грамматика. Построить алгоритм
проверки принадлежности задаваемому ей языку, работающий
полиномиальное время (т.е. число действий не превосходит
полинома от длины проверяемого слова; полином может
зависеть от грамматики).
Задания
4. Дана грамматика с
единственным
нетерминалом K,
нетерминалами 1, 2, 3 и правилами
1)
K→0
K→1K
K→2KK
K→3KKK
2)
K→0
K→K1
K→KK2
K→KKK3
Построить алгоритм проверки выводимости слова в этой
грамматике при чтении слово слева направо. (Число действий
при прочтении одной буквы должно быть ограничено.)
Задания
5. Описать алгоритм рекурсивного спуска распознавания
выражений для следующей грамматики:
1) алфавит:
терминалы: +, *, (, ), x,
нетерминалы: 〈выр〉, 〈оствыр〉, 〈слаг〉, 〈остслаг〉, 〈множ〉;
2) правила:
〈выр〉 → 〈слаг〉 〈оствыр〉
〈оствыр〉 → + 〈выр〉
〈оствыр〉 →
〈слаг〉 → 〈множ〉 〈остслаг〉
〈остслаг〉 → * 〈слаг〉
〈остслаг〉 →
〈множ〉 → x
〈множ〉 → (〈выр〉)
Оценить его сложность.
Задания
6. В грамматике из примера 2 найти левый вывод слова
A = [()([])] и доказать, что он единствен.
7. Написать LL(1)-грамматику языка, задаваемого следующей КСграмматикой:
1) алфавит: K (нетерминал), # (терминал);
2) правила:
K → K #.
8. Описать на псевдокоде (и/или языке высокого уровня, например,
на языке C) алгоритм проверки выводимости слова из
терминалов в LL(1)-грамматике. Оценить его сложность.

Más contenido relacionado

La actualidad más candente

5 Силлогистика
5 Силлогистика5 Силлогистика
5 СиллогистикаVictor Gorbatov
 
Инкапсуляция и полиморфизм в ruby
Инкапсуляция и полиморфизм в rubyИнкапсуляция и полиморфизм в ruby
Инкапсуляция и полиморфизм в rubyEvgeny Smirnov
 
Let you call me hough
Let you call me houghLet you call me hough
Let you call me houghNLPseminar
 
Применение статического анализа при разработке программ
Применение статического анализа при разработке программПрименение статического анализа при разработке программ
Применение статического анализа при разработке программTatyanazaxarova
 
презентация четкие шаги нечеткой логики
презентация четкие шаги нечеткой логикипрезентация четкие шаги нечеткой логики
презентация четкие шаги нечеткой логикиGanenkoViktoria89
 
язык работы с КМАС (Yafoll сообщение 1)
язык работы с КМАС (Yafoll сообщение 1)язык работы с КМАС (Yafoll сообщение 1)
язык работы с КМАС (Yafoll сообщение 1)Alex Shkotin
 
16
1616
16JIuc
 
Способы записи алгоритмов
Способы записи алгоритмовСпособы записи алгоритмов
Способы записи алгоритмовAndrey Dolinin
 
Общие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальОбщие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальAndrey Dolinin
 
Управляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условияУправляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условияEvgeny Smirnov
 
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...Омские ИТ-субботники
 
Ruby: основы ООП
Ruby: основы ООПRuby: основы ООП
Ruby: основы ООПEvgeny Smirnov
 
10 силлогистика
10 силлогистика10 силлогистика
10 силлогистикаJulia Gorbatova
 

La actualidad más candente (19)

лекция 3
лекция 3лекция 3
лекция 3
 
Slovar pr. metodol
Slovar pr. metodolSlovar pr. metodol
Slovar pr. metodol
 
5 Силлогистика
5 Силлогистика5 Силлогистика
5 Силлогистика
 
Инкапсуляция и полиморфизм в ruby
Инкапсуляция и полиморфизм в rubyИнкапсуляция и полиморфизм в ruby
Инкапсуляция и полиморфизм в ruby
 
Let you call me hough
Let you call me houghLet you call me hough
Let you call me hough
 
Ruby строки
Ruby строкиRuby строки
Ruby строки
 
Применение статического анализа при разработке программ
Применение статического анализа при разработке программПрименение статического анализа при разработке программ
Применение статического анализа при разработке программ
 
презентация четкие шаги нечеткой логики
презентация четкие шаги нечеткой логикипрезентация четкие шаги нечеткой логики
презентация четкие шаги нечеткой логики
 
Алгоритмы сжатия данных
Алгоритмы сжатия данныхАлгоритмы сжатия данных
Алгоритмы сжатия данных
 
язык работы с КМАС (Yafoll сообщение 1)
язык работы с КМАС (Yafoll сообщение 1)язык работы с КМАС (Yafoll сообщение 1)
язык работы с КМАС (Yafoll сообщение 1)
 
16
1616
16
 
Logika
LogikaLogika
Logika
 
Способы записи алгоритмов
Способы записи алгоритмовСпособы записи алгоритмов
Способы записи алгоритмов
 
расчетная работа яруллина г.с.афбнк
расчетная работа яруллина г.с.афбнкрасчетная работа яруллина г.с.афбнк
расчетная работа яруллина г.с.афбнк
 
Общие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальОбщие сведения о языке программирования Паскаль
Общие сведения о языке программирования Паскаль
 
Управляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условияУправляющие структуры в Ruby: условия
Управляющие структуры в Ruby: условия
 
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
 
Ruby: основы ООП
Ruby: основы ООПRuby: основы ООП
Ruby: основы ООП
 
10 силлогистика
10 силлогистика10 силлогистика
10 силлогистика
 

Destacado

лекция №4
лекция №4лекция №4
лекция №4student_kai
 
презентация 24
презентация 24презентация 24
презентация 24student_kai
 
Презентация доклад
Презентация докладПрезентация доклад
Презентация докладstudent_kai
 
лекция 22 управление безопасностью-ч2
лекция 22 управление безопасностью-ч2лекция 22 управление безопасностью-ч2
лекция 22 управление безопасностью-ч2student_kai
 
презентация л.р. №6
презентация л.р. №6презентация л.р. №6
презентация л.р. №6student_kai
 
физика горения05
физика горения05физика горения05
физика горения05student_kai
 
слайды к лекции №24
слайды к лекции №24слайды к лекции №24
слайды к лекции №24student_kai
 
к лекции 2
к лекции 2к лекции 2
к лекции 2student_kai
 
лекция №7
лекция №7лекция №7
лекция №7student_kai
 
презентация л.р. №9
презентация л.р. №9презентация л.р. №9
презентация л.р. №9student_kai
 
презентация 15
презентация 15презентация 15
презентация 15student_kai
 
слайды к кур раб ползун тмм
слайды к кур раб ползун тммслайды к кур раб ползун тмм
слайды к кур раб ползун тммstudent_kai
 
лабораторная работа №3
лабораторная работа №3лабораторная работа №3
лабораторная работа №3student_kai
 
лекция№17
лекция№17лекция№17
лекция№17student_kai
 
слайды к лаб1 тмм
слайды к лаб1 тммслайды к лаб1 тмм
слайды к лаб1 тммstudent_kai
 

Destacado (20)

лекция №4
лекция №4лекция №4
лекция №4
 
презентация 24
презентация 24презентация 24
презентация 24
 
Презентация доклад
Презентация докладПрезентация доклад
Презентация доклад
 
лекция 22 управление безопасностью-ч2
лекция 22 управление безопасностью-ч2лекция 22 управление безопасностью-ч2
лекция 22 управление безопасностью-ч2
 
презентация л.р. №6
презентация л.р. №6презентация л.р. №6
презентация л.р. №6
 
физика горения05
физика горения05физика горения05
физика горения05
 
слайды к лекции №24
слайды к лекции №24слайды к лекции №24
слайды к лекции №24
 
модуль 3
модуль 3модуль 3
модуль 3
 
к лекции 2
к лекции 2к лекции 2
к лекции 2
 
лаб № 4
лаб № 4лаб № 4
лаб № 4
 
Evaluation Q1
Evaluation Q1Evaluation Q1
Evaluation Q1
 
л19
л19л19
л19
 
лекция №7
лекция №7лекция №7
лекция №7
 
лек7
лек7лек7
лек7
 
презентация л.р. №9
презентация л.р. №9презентация л.р. №9
презентация л.р. №9
 
презентация 15
презентация 15презентация 15
презентация 15
 
слайды к кур раб ползун тмм
слайды к кур раб ползун тммслайды к кур раб ползун тмм
слайды к кур раб ползун тмм
 
лабораторная работа №3
лабораторная работа №3лабораторная работа №3
лабораторная работа №3
 
лекция№17
лекция№17лекция№17
лекция№17
 
слайды к лаб1 тмм
слайды к лаб1 тммслайды к лаб1 тмм
слайды к лаб1 тмм
 

Más de student_kai

презентация
презентацияпрезентация
презентацияstudent_kai
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкетаstudent_kai
 
основы программирования на языке C
основы программирования на языке Cосновы программирования на языке C
основы программирования на языке Cstudent_kai
 
презентация курсовой работы
презентация курсовой работыпрезентация курсовой работы
презентация курсовой работыstudent_kai
 
лекция№34
лекция№34лекция№34
лекция№34student_kai
 
лекция№32
лекция№32лекция№32
лекция№32student_kai
 
лекция№33
лекция№33лекция№33
лекция№33student_kai
 
лекция№31
лекция№31лекция№31
лекция№31student_kai
 
лекция№30
лекция№30лекция№30
лекция№30student_kai
 
лекция№29
лекция№29лекция№29
лекция№29student_kai
 
лекция№28
лекция№28лекция№28
лекция№28student_kai
 
лекция№27
лекция№27лекция№27
лекция№27student_kai
 
лекция№26
лекция№26лекция№26
лекция№26student_kai
 
лекция№25
лекция№25лекция№25
лекция№25student_kai
 
лекция№25
лекция№25лекция№25
лекция№25student_kai
 
лекция№24
лекция№24лекция№24
лекция№24student_kai
 
лекция№23
лекция№23лекция№23
лекция№23student_kai
 
лекция№22
лекция№22лекция№22
лекция№22student_kai
 
лекция№21
лекция№21лекция№21
лекция№21student_kai
 
лекция№20
лекция№20лекция№20
лекция№20student_kai
 

Más de student_kai (20)

презентация
презентацияпрезентация
презентация
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкета
 
основы программирования на языке C
основы программирования на языке Cосновы программирования на языке C
основы программирования на языке C
 
презентация курсовой работы
презентация курсовой работыпрезентация курсовой работы
презентация курсовой работы
 
лекция№34
лекция№34лекция№34
лекция№34
 
лекция№32
лекция№32лекция№32
лекция№32
 
лекция№33
лекция№33лекция№33
лекция№33
 
лекция№31
лекция№31лекция№31
лекция№31
 
лекция№30
лекция№30лекция№30
лекция№30
 
лекция№29
лекция№29лекция№29
лекция№29
 
лекция№28
лекция№28лекция№28
лекция№28
 
лекция№27
лекция№27лекция№27
лекция№27
 
лекция№26
лекция№26лекция№26
лекция№26
 
лекция№25
лекция№25лекция№25
лекция№25
 
лекция№25
лекция№25лекция№25
лекция№25
 
лекция№24
лекция№24лекция№24
лекция№24
 
лекция№23
лекция№23лекция№23
лекция№23
 
лекция№22
лекция№22лекция№22
лекция№22
 
лекция№21
лекция№21лекция№21
лекция№21
 
лекция№20
лекция№20лекция№20
лекция№20
 

практика 17

  • 1. Практическое занятие 17. Контекстно-свободные грамматики 1. 2. 3. 4. Теоретические сведения Контрольные вопросы Указания по выполнению заданий Задания
  • 2. Теоретические сведения Контекстно-свободные грамматики – это объекты теории формальных грамматик, основы которой были заложены в фундаментальных работах Н.Хомского. Теория формальных грамматик занимается описанием, распознаванием и переработкой языков. Под языком, определенном на алфавите (множестве букв или символов) A, понимается множество слов L ⊆ A*, где A* – множество всех возможных слов (цепочек), состоящих из букв алфавита A. Для его описания вводится грамматика, как механизм, порождающий слова, состоящие из букв его алфавита. Для определения контекстно-свободной грамматики (КС-грамматики), надо: 1) указать конечное множество A, называемое алфавитом; его элементы называют символами; конечные последовательности символов называют словами (в данном алфавите); 2) разделить все символы алфавита A на две группы: терминальные ("окончательные") и нетерминальные ("промежуточные"); 3) выбрать среди нетерминальных символов один, называемый начальным; 4) указать конечное число правил грамматики, каждое из которых должно иметь вид K → X, где K – некоторый нетерминальный символ, а X – слово (в него могут входить и терминальные, и нетерминальные символы).
  • 3. Теоретические сведения Пусть фиксирована КС-грамматика. Выводом в этой грамматике называется последовательность слов X[0], X[1], ..., X[n], в которой X[0] состоит из одного символа, и этот символ – начальный, а X[i + 1] получается из X[i] заменой некоторого нетерминального символа K на слово X по одному из правил грамматики. Слово, составленное из терминальных символов, называется выводимым, если существует вывод, который им кончается. Множество всех выводимых слов (из терминальных символов) называется языком, порождаемым данной грамматикой.
  • 4. Теоретические сведения Пример 1. Пусть задана КС-грамматика: 1) алфавит состоит из четырех терминальных символов (, ), [, ] и одного нетерминального символа E; 2) начальный символ – символ E. 3) правила: E → (E), E → [E], E → EE, E →. Примеры выводимых с помощью заданной грамматики слов: пустое слово, (), ([]), ()[([])], [()[]()[]]. Примеры невыводимых с помощью заданной грамматики слов: (, )(, (], ([)]. Пример 2. Грамматика, порождающая тот же язык, что и в примере 1. 1) алфавит состоит из четырех терминальных символов (, ), [, ] и двух нетерминальных символов T и E; 2) начальный символ – символ E. 3) правила: E → , E → TE, T → (E), T → [E].
  • 5. Теоретические сведения Для каждого нетерминального символа можно рассмотреть множество всех слов из терминальных символов, которые из него выводятся. Каждое правило грамматики можно рассматривать как свойство этих множеств. Покажем это на примере только что приведенной грамматики (пример 2). Пусть T и E – множества слов, выводимых из нетерминалов T и E соответственно. Тогда правилам грамматики соответствуют такие свойства: 1) E → – E содержит пустое слово; 2) E → TE – если слово A принадлежит T, а слово B принадлежит E, то слово AB принадлежит E; 3) T → (E) – если слово A принадлежит E, то слово (A) принадлежит T; 4) T → [E] – если слово A принадлежит E, то слово [A] принадлежит T. Можно доказать, что множества, задаваемые грамматикой, являются минимальными среди всех множеств, удовлетворяющих соответствующим свойствам.
  • 6. Теоретические сведения Пример 3. Метод рекурсивного спуска. Он базируется на применении следующей идеи. Для каждого нетерминального символа K строится процедура ReadK, которая в применении к любому входному слову 1) находит наибольшее начало z слова x, которое может быть началом выводимого из K слова, 2) сообщает, является ли найденное слово z выводимым из K. Пусть буквы поступают по одной. Имеется функция Next, дающая первый непрочитанный символ. Ее значениями могут быть терминальные символы, а также символ EOI, означающий, что все слово уже прочитано. Вызов функции Next не сдвигает границы между прочитанной и непрочитанной частью – для этого есть процедура Move, которая сдвигает границу на один символ (она применима в том случае, если результат Next не равен EOI). Кроме этого, пусть имеется булевская переменная b, значением которой является либо 1 (ИСТИНА) либо 0 (ЛОЖЬ). Теперь к процедуре ReadK можно предъявить следующие требования: 1) ReadK прочитывает из оставшейся части слова максимальное начало A, являющееся началом некоторого слова, выводимого из K, 2) значение b становится истинным или ложным в зависимости от того, является ли A выводимым из K или лишь невыводимым началом выводимого из K слова.
  • 7. Теоретические сведения Пример 4. Алгоритм разбора для LL(1)-грамматик. Его идея заключается в применении левого вывода. Левым выводом (слова в грамматике) называется вывод, в котором на каждом шаге замене подвергается самый левый из нетерминалов. Можно формально доказать, что для каждого выводимого слова (из терминалов) существует левый вывод. Для каждого слова X из терминалов и нетерминалов через Нач(X) обозначим множество всех терминалов, с которых начинаются непустые слова из терминалов, выводимые из X. Для каждого нетерминала K через Послед(K) обозначим множество терминалов, которые встречаются в выводимых (в грамматике) словах сразу же за K. Кроме того, в Послед(K) включается символ EOI, если существует выводимое слово, оканчивающееся на K. Для каждого правила K → V (где K – нетерминал, V – слово, содержащее терминалы и нетерминалы) определим множество направляющих терминалов, обозначаемое Напр(K → V). По определению оно равно Нач(V), к которому добавлено Послед(K), если из V вводится пустое слово.
  • 8. Теоретические сведения Пример 4 (продолжение). Грамматика называется LL(1)грамматикой, если для любых правил K → V и K → W с одинаковыми левыми частями множества Напр(K → V) и Напр(K → W) не пересекаются. Для LL(1)-грамматики существует не более одного возможного продолжения левого вывода. Грамматика называется леворекурсивной, если из некоторого нетерминала K выводится слово, начинающееся с K, но не совпадающее с ним. К леворекурсивным грамматикам LL(1)-метод неприменим – их необходимо преобразовывать к эквивалентным LL(1)-грамматикам или применять для них другие методы распознавания. С учетом всего сказанного можно построить следующий алгоритм проверки выводимости слова из терминалов в LL(1)-грамматике. Мы следуем описанному выше методу поиска левого вывода, храня лишь часть слова, находящуюся правее уже прочитанной части входного слова, т.е. храним слово S из терминалов и нетерминалов, обладающее таким свойством (прочитанную часть входа обозначаем через A):
  • 9. Теоретические сведения Пример 4 (продолжение). 1) слово AS выводимо в грамматике; 2) любой левый вывод входного слова проходит через стадию AS. Эти свойства вмести будем обозначать «(И)». Вначале A пусто, а S состоит из единственного символа – начального нетерминала. Если в некоторый момент S начинается на терминал t и t = Next (Next – функция такая же, как в примере 17.3), то можно выполнить команду Move (Move – процедура такая же, как в примере 17.3) и удалить символ t, являющийся начальным в S, поскольку при этом AS не меняется. Если S начинается на терминал t и t ≠ Next, то входное слово невыводимо – ибо по условию любой его вывод должен проходить через AS. (Это же справедливо и в случае Next = EOI.) Если S пусто, то из условия (И) следует, что входное слово выводимо тогда и только тогда, когда Next = EOI.
  • 10. Теоретические сведения Пример 4 (продолжение). Остается случай, когда S начинается с некоторого нетерминала K. По сказанному выше все левые выводы из S слов, начинающихся на символ Next, начинаются с применения к S одного и того же правила – того, для которого Next принадлежит направляющему множеству. Если таких правил нет, то входное слово невыводимо. Если такое правило есть, то нужно применить его к первому символу слова S – при этом свойство (И) не нарушится. Алгоритм заканчивает работу, поскольку при появлении нетерминала в начале слова S происходит чтение со входа или остановка, а бесконечный цикл сменяющих друг друга терминалов в начале S означал бы, что грамматика леворекурсивна.
  • 11. Контрольные вопросы 1. Формальная грамматика. 2. КС-грамматика. 3. Вывод в КС-грамматике. 4. Выводимое (в грамматике) слово. 5. Задание множеств КС-грамматиками. 6. Метод рекурсивного спуска. 7. Левый вывод. 8. LL(1)-грамматика. 9. Леворекурсивная грамматика. 10.Алгоритм разбора для LL(1)-грамматик.
  • 12. Указания по выполнению заданий 1. 2. 3. 4. Получить задание Выполнить задание. Подготовить отчет по выполнению задания. Отчет должен включать задание и описание этапов выполнения задания. Ответить на вопросы по выполнению задания и контрольные вопросы
  • 13. Задания 1. Построить КС-грамматику, в которой выводимы слова 1) 00..0011..11 (число нулей равно числу единиц); 2) 00..0011..11 (число нулей вдвое больше числа единиц); 3) 00..0011..11 (число нулей больше числа единиц) и только они. 2. Доказать, что не существует КС-грамматики, в которой были бы выводимы слова вида 00..0011..1122..22, в которых числа нулей, единиц и двоек равны, и только они. 3. Дана произвольная КС-грамматика. Построить алгоритм проверки принадлежности задаваемому ей языку, работающий полиномиальное время (т.е. число действий не превосходит полинома от длины проверяемого слова; полином может зависеть от грамматики).
  • 14. Задания 4. Дана грамматика с единственным нетерминалом K, нетерминалами 1, 2, 3 и правилами 1) K→0 K→1K K→2KK K→3KKK 2) K→0 K→K1 K→KK2 K→KKK3 Построить алгоритм проверки выводимости слова в этой грамматике при чтении слово слева направо. (Число действий при прочтении одной буквы должно быть ограничено.)
  • 15. Задания 5. Описать алгоритм рекурсивного спуска распознавания выражений для следующей грамматики: 1) алфавит: терминалы: +, *, (, ), x, нетерминалы: 〈выр〉, 〈оствыр〉, 〈слаг〉, 〈остслаг〉, 〈множ〉; 2) правила: 〈выр〉 → 〈слаг〉 〈оствыр〉 〈оствыр〉 → + 〈выр〉 〈оствыр〉 → 〈слаг〉 → 〈множ〉 〈остслаг〉 〈остслаг〉 → * 〈слаг〉 〈остслаг〉 → 〈множ〉 → x 〈множ〉 → (〈выр〉) Оценить его сложность.
  • 16. Задания 6. В грамматике из примера 2 найти левый вывод слова A = [()([])] и доказать, что он единствен. 7. Написать LL(1)-грамматику языка, задаваемого следующей КСграмматикой: 1) алфавит: K (нетерминал), # (терминал); 2) правила: K → K #. 8. Описать на псевдокоде (и/или языке высокого уровня, например, на языке C) алгоритм проверки выводимости слова из терминалов в LL(1)-грамматике. Оценить его сложность.