Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Метод рекурсивного спуска

Классификация грамматик и языков по Хомскому | Разбор цепочек | Преобразования грамматик | Лексический анализ | Задачи лексического анализа | О семантическом анализе | Обработка описаний | Контроль контекстных условий в выражении | Контроль контекстных условий в операторах | Язык внутреннего представления программы |


Читайте также:
  1. B. Неклассическая методология
  2. C. Постнеклассическая методология
  3. D) сохранения точных записей, определения установленных методов (способов) и сохранения безопасности на складе
  4. D.2. Методы оценки технических уязвимостей
  5. I 7 D I РЕЛИГИЯ И НАУЧНЫЕ МЕТОДЫ
  6. I РЕЛИГИЯ И НАУЧНЫЕ МЕТОДЫ
  7. I РЕЛИГИЯ И НАУЧНЫЕ МЕТОДЫ

 

 

Пример: пусть дана грамматика G =({a,b,c, ^}, {S,A,B}, P, S), где

P: S ® AB^

A ® a | cA

B ® bA

и надо определить, принадлежит ли цепочка caba языку L(G).

 

Построим вывод этой цепочки:

S ® AB^ ® cAB^ ® caB^ ® cabA^ ® caba^

Следовательно, цепочка принадлежит языку L(G).

 

Последовательность применений правил вывода эквивалентна построению дерева разбора методом "сверху вниз":

 

 

 

 

Метод рекурсивного спуска (РС-метод) реализует этот способ практически "в лоб": для каждого нетерминала грамматики создается своя процедура, носящая его имя; ее задача - начиная с указанного места исходной цепочки найти подцепочку, которая выводится из этого нетерминала. Если такую подцепочку считать не удается, то процедура завершает свою работу вызовом процедуры обработки ошибки, которая выдает сообщение о том, что цепочка не принадлежит языку, и останавливает разбор. Если подцепочку удалось найти, то работа процедуры считается нормально завершенной и осуществляется возврат в точку вызова. Тело каждой такой процедуры пишется непосредственно по правилам вывода соответствующего нетерминала: для правой части каждого правила осуществляется поиск подцепочки, выводимой из этой правой части. При этом терминалы распознаются самой процедурой, а нетерминалы соответствуют вызовам процедур, носящих их имена.

 

Пример: совокупность процедур рекурсивного спуска для грамматики
G = ({a,b,c,^}, {S,A,B}, P, S), где

P: S ® AB^

A ® a | cA

B ® bA

будет такой:

 

#include <stdio.h>

int c;

FILE *fp;/*указатель на файл, в котором находится анализируе-мая цепочка */

void A();

void B();

void ERROR(); /* функция обработки ошибок */

void S() {A(); B();

if (c!= '^') ERROR();

}

void A() {if (c=='a') c = fgetc(fp);

else if (c == 'c') {c = fgetc(fp); A();}

else ERROR();

}

void B() {if (c == 'b') {c = fgetc(fp); A();}

else ERROR();

}

void ERROR() {printf("ERROR!!!\n"); exit(1);}

main() {fp = fopen("data","r");

c = fgetc(fp);

S();

printf("SUCCESS!!!\n"); exit(0);

}

 


Дата добавления: 2015-11-14; просмотров: 44 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Второй этап: по ДС пишем программу| О применимости метода рекурсивного спуска

mybiblioteka.su - 2015-2024 год. (0.007 сек.)