Читайте также: |
|
Пример: пусть дана грамматика 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Второй этап: по ДС пишем программу | | | О применимости метода рекурсивного спуска |