А. шень Издание шестое, дополненное Москва
Скачать 1.62 Mb.
|
(2) Если ситуация [L → U V, t] согласована с SJ (согласно прави- лу (1)), а V начинается на нетерминал K, то SJ принадлежит Лев(K, s) для всех терминалов s, которые могут начинать слова, выводимые из слова V ∖ K (слово V без первой буквы K), а также для s = t, если из V ∖ K выводится пустое слово. (3) Если SJ входит в Лев(L, t) для некоторых L и t, причём L → V | правило грамматики и V начинается на нетерми- нал K, то SJ принадлежит Лев(K, s) для всех терминалов s, которые могут начинать слова, выводимые из V ∖ K, а также для s = t, если из V ∖ K выводится пустое слово. 16.4. LR(1)-грамматики, LALR(1)-грамматики 309 16.4.5. Дайте определение LR(1)-конфликтов типа сдвиг/свёртка и свёртка/свёртка. Решение. Пусть дана некоторая грамматика. Пусть S | произволь- ное слово из терминалов и нетерминалов. Если множество Сост(S) со- держит ситуацию, в которой справа от подчёркивания стоит терми- нал t, то говорят, что для пары ⟨S, t⟩ возможен сдвиг. (Это определение не изменилось по сравнению с SLR(1)-случаем | вторые компоненты пар из Сост(S) не учитываются.) Если в Сост(S) есть ситуация, в которой справа от подчёркивания ничего нет, а вторым членом пары является терминал t, то говорят, что для пары ⟨S, t⟩ LR(1)-возможна свёртка (по соответствующему правилу). Говорят, что для пары ⟨S, t⟩ возникает LR(1)-конфликт типа сдвиг/свёртка, если возможны и сдвиг, и свёртка. Говорят, что для па- ры ⟨S, t⟩ возникает LR(1)-конфликт типа свёртка/свёртка, если есть несколько правил, по которым возможна свёртка. Грамматика называется LR(1)-грамматикой, если в ней нет LR(1)- конфликтов типа сдвиг/свёртка и свёртка/свёртка ни для одной пары ⟨ S, t⟩. 16.4.6. Постройте алгоритм проверки выводимости слова в LR(1)- грамматике. Решение. Как и раньше, на каждом шаге LR-процесса можно одно- значно определить, какой шаг только и может быть следующим. Полезно (в частности, для LALR(1)-разбора, см. ниже) понять, как связаны понятия LR(0) и LR(1)-согласованности. 16.4.7. Сформулируйте и докажите соответствующее утверждение. Ответ. Пусть фиксирована некоторая грамматика. Слово S из тер- миналов и нетерминалов является LR(0)-согласованным с ситуацией K → U V тогда и только тогда, когда оно LR(1)-согласовано с парой [K → U V, t] для некоторого терминала t (или для t = EOI). То же самое другими словами: Лев(K) есть объединение Лев(K, t) по всем t. В по- следней форме это совсем ясно. Замечание. Таким образом, функция Сост(S) в LR(1)-смысле явля- ется расширением функции Сост(S) в LR(0)-смысле: Сост LR(0) (S) полу- чается из Сост LR(1) (S), если во всех парах выбросить вторые члены. Теперь мы можем дать определение LALR(1)-грамматики. Пусть фиксирована некоторая грамматика, S | слово из нетерминалов и тер- миналов, t | некоторый терминал (или EOI). Будем говорить, что для 310 16. Синтаксический разбор слева направо (LR) пары ⟨S, t⟩ LALR(1)-возможна свёртка по некоторому правилу, если существует другое слово S 1 с Сост LR(0) (S 0 ) = Сост LR(0) (S 1 ), причём для пары ⟨S 1 , t⟩ LR(1)-возможна свёртка по рассматриваемому правилу. Далее определяются конфликты (естественным образом), и граммати- ка называется LALR(1)-грамматикой, если конфликтов нет. 16.4.8. Докажите, что любая SLR(1)-грамматика является также и LALR(1)-грамматикой, а любая LALR(1)-грамматика является также и LR(1)-грамматикой. [Указание. Это | простое следствие определений.] 16.4.9. Постройте алгоритм проверки выводимости в LALR(1)- грамматике, который хранит в стеке меньше информации, чем соот- ветствующий LR(1)-алгоритм. [Указание. Достаточно хранить в стеке множества Сост LR(0) (S), поскольку согласно определению LALR(1)-возможность свёртки ими определяется. (Так что сам алгоритм ничем не отличается от SLR(1)- случая, кроме таблицы возможных свёрток.)] 16.4.10. Приведите пример LALR(1)-грамматики, которая не явля- ется SLR(1)-грамматикой. 16.4.11. Приведите пример LR(1)-грамматики, которая не является LALR(1)-грамматикой. 16.5. Общие замечания о разных методах разбора Применение этих методов на практике имеет свои хитрости и тон- кости, которых мы не касались. (Например, таблицы следует хранить по возможности экономно.) Часто оказывается также, что для неко- торого входного языка наиболее естественная грамматика не является LL(1)-грамматикой, но является LR(1)-грамматикой, а также может быть заменена на LL(1)-грамматику без изменения языка. Какой из этих вариантов выбрать, не всегда ясно. Дилетантский совет: если Вы сами проектируете входной язык, то не следует выпендриваться и упо- треблять одни и те же символы для разных целей | и тогда обычно не- сложно написать LL(1)-грамматику или рекурсивный анализатор. Если же входной язык задан заранее с помощью LR(1)-грамматики, не явля- ющейся LL(1)-грамматикой, то лучше её не трогать, а разбирать как есть. При этом могут оказаться полезные средства автоматического 16.5. Общие замечания о разных методах разбора 311 порождения анализаторов, наиболее известными из которых являются yacc (UNIX) и bison (GNU). Большое количество полезной и хорошо изложенной информации о теории и практике синтаксического разбора имеется в книге Ахо, Сети и Ульмана (см. список книг для чтения). Книги для чтения А. Ахо, Р. Сети, Дж. Ульман. Компиляторы: принципы, технологии и инструменты. М.: Вильямс, 2001. А. Ахо, Дж. Хопкрофт, Дж. Ульман. Построение и анализ вычисли- тельных алгоритмов. М.: Мир, 1979. Н. Вирт. Систематическое программирование. Введение. М.: Мир, 1977. Н. Вирт. Алгоритмы + структуры данных = программы. М.: Мир, 1985. Д. Гасфилд. Строки, деревья и последовательности в алгоритмах. СПб.: Невский диалект, 2003. Д. Грис. Наука программирования. М.: Мир, 1984. М. Гэри, Д. Джонсон. Вычислительные машины и труднорешаемые за- дачи. М.: Мир, 1982. Э. Дейкстра. Дисциплина программирования. М.: Мир, 1978. С. Дасгупта, Х. Пападимитриу, У. Вазирани. Алгоритмы. М.: МЦНМО, 2014. Т. Кормен, Ч. Лейзерсон, Р. Ривест. Алгоритмы: построение и анализ. М.: МЦНМО, 2000. А. Г. Кушниренко, Г. В. Лебедев. Программирование для математиков. М.: Наука, 1988. В. Липский. Комбинаторика для программистов. М.: Мир, 1988. Э. Рейнгольд, Ю. Нивергельт, Н. Део. Комбинаторные алгоритмы. Те- ория и практика. М.: Мир, 1980. Дж. Хопкрофт, Р. Мотвани, Дж. Ульман. Введение в теорию автома- тов, языков и вычислений. М.: Вильямс, 2002. Предметный указатель 𝐴 * -алгоритм поиска 151 AND-OR-дерево 225 backtracking 60 Borland 4 LALR(1)-грамматика 310 LL(1)-грамматика 289 LL(1)-разбор 286 LR(0)-грамматика 302 LR(1)-грамматика 309 LR-процесс 294 NP-полнота 70 SLR(1)-грамматика 306 Turbo Pascal 4 , 29 АВЛ-дерево 258 автомат конечный 90 , 178 , 190 | | недетерминированный 195 азбука Морзе 231 алгоритм Маккрейта 203 | чередующихся цепей 174 алфавит 180 , 230 альфа-бета-процедура 223 , 224 Б-дерево 267 билеты счастливые, число 58 биномиальный коэффициент 136 ближайшая сумма 31 Бойера { Мура алгоритм 186 бридж-ит, игра 217 буква 230 |, частота 231 быстрое умножение 28 величина потока 161 { 164 , 166 вершина графа 106 , 130 вершинное покрытие 176 ветвей и границ метод 60 вращение левое, правое 259 | малое, большое 259 вывод в грамматике 269 | левый 286 | правый 294 выводимость в КС-грамматике, полиномиальный алгоритм 273 выигрышные позиции 212 выпуклая оболочка 81 , 110 выражение 272 | регулярное 193 высота 251 гауссовы числа 17 Гейла игра 217 голландский флаг 36 Горнера схема 26 грамматика LALR(1) 310 | LL(1) 289 | LR(0) 302 314 Предметный указатель | LR(1) 309 | SLR(1) 306 | выражений 272 | контекстно-свободная 269 | леворекурсивная 290 граф, вершина 106 , 130 | двудольный 155 , 173 |, кратчайшие пути 146 | неориентированный 130 | ориентированный 106 |, ребро 130 |, связная компонента 113 , 130 , 152 | связный 106 Грея коды 49 датчик поворота 51 двоичный поиск 33 двудольный граф 155 , 173 Дейкстры алгоритм (кратчайшие пути) 148 , 150 дек, реализация в массиве 105 |, ссылочная реализация 110 деление с остатком 10 | | быстрое 22 дерево 60 |, AND-OR- 225 |, Б-дерево 267 |, вершина 121 |, высота 122 | двоичное 75 |, корень 121 |, обход 62 , 123 , 127 , 142 | | нерекурсивный 141 | подслов 197 | позиций 60 | |, реализация 67 | полное двоичное 250 |, рекурсивная обработка 122 | сбалансированное 258 | сжатое суффиксное 199 |, ссылочная реализация 121 , 252 | суффиксное 197 | упорядоченное 251 |, число вершин 122 , 142 | | листьев 122 десятичная дробь, период 20 | запись, печать 17 , 20 , 141 | | | рекурсивная 119 | |, чтение 92 детерминизация конечного автомата 196 динамическое программирование 135 , 137 | |, кратчайшие пути 146 диофантово уравнение 12 , 14 дополнение регулярного множества 197 дополняющий путь 165 , 167 , 169 Евклида алгоритм 12 , 13 | | двоичный 13 жулик на пособии 31 задача NP-полная 70 | о рюкзаке 70 , 140 игра Гейла 217 | крестики-нолики 216 | мат с неподвижным королём 228 | ним 211 |, ретроспективный анализ 227 | с нулевой суммой 213 | с полной информацией 210 |, цена 212 индуктивная функция 38 индуктивное расширение 39 исток 159 источник 195 калькулятор стековый 144 Предметный указатель 315 Каталана число 55 , 59 , 137 Кёнига теорема 176 Кнута { Морриса { Пратта алгоритм 182 код 230 | Грея 49 | однозначный 230 | префиксный 231 |, средняя длина 232 | Хаффмана 235 { 237 | Шеннона { Фано 237 { 239 кодовое слово 230 количество различных 24 , 80 комментарии вложенные 91 |, удаление 91 конец слова 180 конечный автомат 90 , 178 , 190 | | недетерминированный 195 контекстно-свободная грамматика 269 конфликт свёртка/свёртка 302 , 306 , 309 | сдвиг/свёртка 302 , 306 , 309 коэффициент биномиальный 136 Крафта { Макмиллана неравенство 231 { 234 крестики-нолики, игра 216 критическое ребро 171 КС-грамматика 269 Лев(𝐾) 296 Лев(𝐾, 𝑡) 307 ЛевКонт(𝐾 → 𝑈) 295 ЛевКонт(𝐾 → 𝑈, 𝑡) 307 левый контекст правила 295 Маккрейта алгоритм 199 , 203 максимальное паросочетание 173 { 176 максимальный поток 164 , 169 массив 23 | с минимальным элементом 115 | суффиксов 208 матриц произведение 149 матрица цен 149 матрицы, порядок умножения 138 медиана, поиск 88 , 133 метод потенциалов 151 минимальный разрез 164 , 169 минимум, поиск 84 многоугольника триангуляция 57 многочлен, значение 26 |, производная 27 |, умножение 27 , 28 множество, представление 241 , 244 | | деревом 250 |, реализация в битовом массиве 111 | | перечнем 112 | регулярное 194 |, тип данных 111 множитель 272 моделирование, очередь событий 116 монотонных последовательностей перечисление 47 Морзе азбука 231 наибольший общий делитель 11 наименьшее общее кратное 13 Напр(𝐾 → 𝑉 ) 289 Нач(𝑋) 277 , 288 начало слова 180 неассоциативное произведение 139 недетерминированный конечный автомат 195 неориентированный граф 130 неравенство Крафта { Макмиллана 231 { 234 нетерминал 269 316 Предметный указатель нижние оценки числа сравнений 84 ним, игра 211 НОД 11 НОК 13 обмен значений 8 образец, поиск 178 обратная перестановка 35 | польская запись 144 обход дерева 60 , 220 | | рекурсивный 127 общий элемент (в упорядоченных массивах) 31 опечатки, поиск 249 ориентированный граф 106 орфография, проверка 249 остаточная сеть 164 , 165 остаточный граф 165 , 170 открытая адресация 242 очередь 103 | из двух стеков 104 | приоритетная 115 |, реализация в массиве 103 |, ссылочная реализация 108 ошибка: индекс за границей 29 , 34 , 35 , 73 , 75 паросочетание 173 { 176 паскаль, язык 4 , 29 Паскаля треугольник 57 , 136 перебор с возвратами 60 |, сокращение 223 пересечение регулярных множеств 197 | упорядоченных массивов 31 перестановка обратная 35 , 53 | частей массива 25 |, чётность 35 перестановок перечисление 44 , 52 , 124 период десятичной дроби 20 поддерево 251 подмножеств перечисление 44 , 45 подпоследовательность максимальная возрастающая 41 | общая 40 |, проверка 40 подслово 180 |, поиск 182 , 185 , 186 , 188 позиции в суффиксном дереве 200 | проигрышные и выигрышные 212 поиск 𝐴 * -алгоритм 151 | 𝑘-го по порядку 88 , 133 , 257 | в глубину 153 | в ширину 114 , 152 | двоичный 33 | кратчайшего пути 146 | минимума 84 | образца 186 , 188 , 190 | одного из слов 191 | подслова 178 , 182 , 185 , 186 , 188 | представителя большинства 88 Посл(𝑋) 277 Послед(𝑋) 288 последовательности монотонные, перечисление 125 последовательность, содержащая все слова длины 𝑛 108 постфиксная запись 144 потенциал 151 поток 157 , 159 | через разрез 162 потомок вершины 121 права авторские 4 предпоток 164 приведение 294 приоритетная очередь 115 программа сжатия информации 240 Предметный указатель 317 программирование динамическое 135 , 137 , 273 проигрышные позиции 212 произведение многочленов 27 | неассоциативное 56 , 139 пропускная способность 159 | | разреза 163 , 164 , 166 простые множители 15 путей число 150 Рабина алгоритм 188 разбиений на слагаемые перечисление 48 , 126 | | число 57 разбор LL(1) 286 | LR(1) 294 |, общий КС-алгоритм 273 |, рекурсивный спуск 275 разложение на множители 15 размещения с повторениями 43 , 123 разрез 157 , 159 , 162 расстановки функция 241 расширение индуктивное 39 ребро графа 130 регулярное выражение 193 | множество 194 | |, дополнение 197 | |, пересечение 197 рекурсивная программа 117 рекурсивный спуск 275 рекурсия 117 |, устранение 135 ретроспективный анализ игры 227 рюкзак, заполнение 70 , 140 свёртка 294 связная компонента неориентированного графа 130 | | ориентированного графа 113 , 131 , 152 связный граф 106 сдвиг 294 сеть 157 , 159 , 162 сжатие информации 240 сжатое суффиксное дерево 199 символ 230 |, код 230 | начальный 269 | нетерминальный 269 | терминальный 269 ситуация грамматики 297 скобки, правильность 98 , 270 скобок расстановка 56 слагаемое 272 слияние упорядоченных массивов 30 слово 180 | выводимое 269 сортировка 𝑛 log 𝑛 73 | деревом 75 , 115 | квадратичная 72 |, нижняя оценка сложности 82 | слиянием 73 , 80 | топологическая 128 , 155 | Хоара (быстрая) 80 , 132 | | нерекурсивная 143 | цифровая 83 |, число сравнений 82 Сост(𝑆) 298 составные символы, замена 90 сочетаний число 57 , 136 ссылки суффиксные 201 стек 96 |, два в массиве 100 | отложенных заданий 141 |, реализация в массиве 97 |, ссылочная реализация 100 стековый калькулятор 144 степень, быстрое вычисление 9 318 Предметный указатель |, вычисление 9 |, рекурсивная программа 118 сток 160 стратегия в игре 214 | позиционная 214 суммарная величина потока 161 { 164 , 166 суммирование массива рекурсивное 120 суффикс 199 суффиксное дерево 197 , 199 суффиксные ссылки 201 суффиксный массив 208 счастливые билеты, число 58 теорема Кёнига 176 | Форда { Фалкерсона 164 | Холла о представителях 176 , 177 | Цермело 214 терминал 269 | направляющий 289 топологическая сортировка 128 , 155 треугольник Паскаля 136 триангуляция многоугольника 57 , 137 упорядоченное дерево 251 факториал 11 |, рекурсивная программа 117 ферзей расстановка 60 Фибоначчи последовательность 11 , 137 , 258 | |, быстрое вычисление 11 Флойда алгоритм 147 , 197 Форда { Беллмана алгоритм 146 функция индуктивная 38 | расстановки 241 ханойские башни, нерекурсивная программа 140 | |, рекурсивная программа 119 Хаффмана код 235 { 237 хеш-функция 241 |, универсальное семейство 246 , 248 хеширование 241 |, оценка числа действий 246 | с открытой адресацией 242 | со списками 244 | универсальное 246 Хоара сортировка 80 , 132 | | нерекурсивная 143 хорды окружности 57 целые точки в круге 18 цена игры 212 , 214 | |, вычисление 220 Цермело теорема 214 цикл эйлеров (по всем рёбрам графа) 106 циркуляция 172 частота буквы 231 чётность перестановки 35 число Каталана 55 , 59 , 137 | общих элементов 28 | разбиений 57 | сочетаний 57 | счастливых билетов 58 Шеннона { Фано код 237 { 239 энтропия Шеннона 238 язык контекстно-свободный 269 | не контекстно-свободный 271 Указатель имён Адельсон-Вельский, Г. М. 258 Ахо (Aho, A. V.) 70, 197, 311, 312 Баур (Baur, W.) 27 Брудно, А. Л. 25, 228 Вазирани (Vasirani, U.) 312 Вайнцвайг, М. Н. 40 Варсанофьев, Д. В. 40, 248 Вирт (Wirth, N.) 312 Вьюгин, М. В. 42 Гарднер (Gardner, M.) 217 Гасфилд (Gus˛eld, D.) 312 Гейл (Gale, D.) 217, 219 Грис (Gries, D.) 25, 31, 34, 41, 312 Гросс (Gross, Oliver) 218 Гэри (Garey, M. R.) 70, 312 Дасгупта (Dasgupta, S.) 312 Дейкстра (Dijkstra, E. W.) 13, 21, 36, 312 Део (Deo, N.) 268, 312 Джонсон (Johnson, D. S.) 70, 312 Диментман, А. М. 40 Звонкин, А. К. 141 Звонкин, Д. 14 Карп (Karp, R. M.) 169, 171, 172, 174 Каталан (Catalan, C. E.) 55, 59, 137 Кёниг (K}onig, D.) 176 Кнут (Knuth, D. E.) 182 Коган, А. Г. 37 Кормен (Cormen, T.) 312 Крафт (Kraft, L. C.) 231, 233 Кушниренко, А. Г. 25, 27, 38, 104, 105, 312 Ландис, Е. М. 258 Лебедев, Г. В. 312 Лейзерсон (Leiserson, C.) 312 Липский (Lipski, W.) 312 Лисовский, Анджей 141 Макмиллан (McMillan, B.) 231, 233 Матиясевич, Ю. В. 4, 21, 182 Мотвани (Motvani, R.) 312 Нивергельт (Nievergelt, J.) 268, 312 Пападимитриу (Papadimitriou, C.) 312 Паскаль (Pascal, B.) 4, 136 Рейнгольд (Reingold, E. M.) 268, 312 Ривест (Rivest, R.) 312 Сети (Sethi, R.) 197, 311, 312 Сэвич (Walter Savitch) 132 Торхов, Ю. Н. 4 Ульман (Ullman, J. D.) 70, 197, 311, 312 Фалкерсон (Fulkerson, D. R.) 164, 166{168, 171, 175, 176 Фано (Fano, R. M.) 237 Форд (Ford, L. R., Jr.) 164, 166{ 168, 171, 175, 176 Хоар (Hoare, C. A. R.) 3, 132, 143 320 Предметный указатель Холл (Hall, P.) 176, 177 Хопкрофт (Hopcroft, J.) 70, 312 Цвик (Zwick, U.) 167 Шеннон (Shannon, C.) 218, 237, 238 Штрассен (Strassen, V.) 27 Эдмондс (Edmonds, J. R.) 169, 171, 172, 174 Научно-популярное издание Александр Шень ПРОГРАММИРОВАНИЕ: ТЕОРЕМЫ И ЗАДАЧИ Оригинал-макет: В. Шувалов Дизайн обложки: У. Сопова Подписано в печать 25.08.2016 г. Формат 60 × 90 1 / 16 . Бумага офсетная. Печать офсетная. Печ. л. 20. Тираж 2000 экз. Заказ Ђ Издательство Московского центра непрерывного математического образования. 119002, Москва, Большой Власьевский пер., 11. Тел. (499) 241-08-04. Отпечатано в ООО «Типография "Миттель Пресс\». г. Москва, ул. Руставели, д. 14, стр. 6. Тел./факс +7 (495) 619-08-30, 647-01-89. E-mail: mittelpress@mail.ru Книги издательства МЦНМО можно приобрести в магазине «Математическая книга», Москва, Большой Власьевский пер., д. 11. Тел. (495) 745-80-31. E-mail: biblio@mccme.ru |