Пред.
След.
Макеты страниц
Распознанный текст, спецсимволы и формулы могут содержать ошибки, поэтому с корректным вариантом рекомендуем ознакомиться на отсканированных изображениях учебника выше Также, советуем воспользоваться поиском по сайту, мы уверены, что вы сможете найти больше информации по нужной Вам тематике ДЛЯ СТУДЕНТОВ И ШКОЛЬНИКОВ ЕСТЬ
ZADANIA.TO
7.1.3. Конструктивные процедуры грамматического выводаПри перечислении последовательность грамматик порождается независимо от выборки и каждая грамматика оценивается относительно этой выборки. Это полезное представление операции вывода, но маловероятно, чтобы оно могло быть практически полезно. Может потребоваться очень много времени, чтобы отвергнуть грамматики, которые „очевидно" не должны рассматриваться при данной выборке. Другой способ вывода — изучить выборку и построить по ней простую грамматику, порождающую язык, в который входят все положительные предложения этой выборки. Процедура построения должна ограничиться „разумными" грамматиками, т. е. такими, которые на некотором этапе Метод Соломонова В одном из первых обсуждений этой проблемы Соломонов (1964а, б) предложил метод вывода контекстно-свободных грамматик по конечной выборке. Его метод основан на теореме Теорема В теореме утверждается, что если
Задача сводится к поиску подходящих цепочек В упрощенной версии процедуры Соломонова в выборке разыскиваются цепочки вида Для иллюстрации этого метода выведем грамматику из выборки
Все цепочки в
Грамматика уже слишком обобщена, поскольку допускает цепочки вида Затем алгоритм рекурсивно применяется к множеству Все его цепочки имеют вид
Теперь рассмотрим множество
Разумеется, пустую цепочку
Она порождает язык, содержащий выборку Применяя алгоритм пронумеруем цепочки из
Если определять цепочки так, чтобы они были единичной длины, как подразумевалось в предыдущем примере, то все они (кроме (1)) имеют вид
Это множество продукций ведет к нежелательным последствиям: в дальнейшем получается слишком сложное множество продукций для этого простого случая. Кроме того, грамматика (38) допускает такие цепочки, как
Уже эти продукции создадут требуемый язык, но они обладают эстетическим недостатком, так как первые две определяют два различных типа основных арифметических выражений. Эту трудность можно обойти, если наш алгоритм подойдет к анализу предложений (37) с иных позиций. Напомним, что теорема
Эти две продукции порождают требуемые арифметические выражения так, что уровни вложения в полученной грамматике соответствуют разумной последовательности вычислений. Итак, алгоритм пример, полезность обсуждаемого метода в каждом отдельном случае сильно зависит от выбранного способа выделения цепочек GRIN 1 Фельдман (1967; Фельдман и др. 1969) разработал программу Программа функционирует в два этапа. На первом формируется множество продукций, достаточных для порождения выборки. Это множество включает в себя определенные продукции, называемые остаточными и имеющие вид Для иллюстрации метбда выведем грамматику из выборки
Сначала Сначала должна анализироваться цепочка
Далее идет цепочка
Для вывода цепочки
Для остальных цепочек добавляем
Вся грамматика состоит из продукций
Далее остаточные продукции сливаются. Например, продукция
Заметим, что новая грамматика содержит рекурсивные конструкции и, таким образом, способна породить бесконечный язык. Наконец, грамматика упрощается еще больше, но так, чтобы порождаемый ею язык не изменился. Для этого сливаются продукции, которые отличаются только обозначением переменной. В (49) можно подставить
Для построения из цепочек стержневых грамматик была написана похожая, но более сложная программа GRIN 2. Эти грамматики могут порождать языки, обладающие многими свойствами простых языков программирования. Вывод с использованием семантики Практически применяемые грамматики образованы не абстрактными продукциями, а командами построения предложений, имеющих смысл. Рассмотрим, в частности, языки программирования. Оператор на Фортране
— это команда „выбрать из памяти значение С, поместить его в рабочий регистр, выбрать из памяти значение В, сложить со значением С, хранящимся в рабочем регистре, и поместить результат в регистр для
где каждый уровень вложения соответствует элементарной операции на Фортране. В работах Креспи-Регицци (1971) и Креспи-Регицци, Мелканов и Лихтен (1973) излагается процедура грамматического вывода, в которой для вывода грамматики, лежащей в основе рассматриваемого языка, используется знание семантики предложений в выборке. Креспи-Регицци с соавторами высказали мысль о том, что эта процедура могла бы помочь разработчикам языков программирования, позволив им описывать примерами язык, который они хотят получить, вместо того, чтобы давать его формальное определение. Соответствующая грамматика была бы построена тогда при помощи вывода по примерам. Вывод осуществляется в три этапа. (1) Для каждой цепочки из
где а — это неформально „имя переменной". Предложение (63) служит примером цепочки сложений. Ее семантическая структура указывает на то, что сложения выполняются в порядке справа налево. Для построения пробной грамматики предположим, что
Грамматика (54) порождает в точности цепочку (53). Для обобщения грамматики нетерминальные символы объединяются в классы, определяемые цепочками терминальных символов, выводимыми из нетерминалов одного класса. Из двух предложенных Креспи-Регицци и др. алгоритмов мы опишем более простой. В этом алгоритме два нетерминала сливаются, если множества терминалов, которые могут появиться в качестве первого или последнего символа цепочек, выводимых из каждого нетерминала, совпадают. Точнее, пусть продукция левого терминального (не обязательно самого левого) символа в цепочке, выводимой из Применим этот метод обобщения к грамматике (54), чтобы лучше разобраться в работе алгоритма. Но сначала надо задать правило вычисления терминального сечения. Пусть Обобщим теперь грамматику (54). Первый шаг — нахождение
Подставляя вместо символа
Делаем подстановку опять, на этот раз для подсчета
Поскольку
Грамматика (58) порождает такие цепочки, как
представляющие собой разумное обобщение цепочки (53). Действительно, для формирования грамматики, описывающей арифметические выражения, достаточно 10 продуманно выбранных предложений. Ясно, что этот алгоритм обладает рядом интересных свойств. Вместе с тем он имеет и недостатки. Креспи-Регицци и др. отмечают, что алгоритм формирует ограниченное множество грамматик операторного предшествования (Айронс, 1961). Чтобы поправить дело, они предлагают метод обобщений, в котором нетерминалы сливаются только в том случае, когда их терминальные сечения совпадают (если рассматривать не более
|
1 |
Оглавление
|