Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Распечатка. Шпоры.doc
Скачиваний:
9
Добавлен:
28.04.2019
Размер:
644.61 Кб
Скачать

Вопрос 12.2

Грамматики операторного предшествования

Операторной грамматикой называется КС-грамматика без -правил, в которой правые части всех правил не содержат смежных нетерминальных символов. Для операторной грамматики отношения предшествования можно задать на множе­стве терминальных символов (включая символы H и K).

Грамматикой операторного предшествования называется операторная КС-грам­матика G(VN,VT,P,S), V = VTVN, для которой выполняются следующие усло­вия:

1. Для каждой упорядоченной пары терминальных символов выполняется не более чем одно из трех отношений предшествования:

  • а =• Ь, если и только если существует правило Axaby  Р или правило АхаСbу, где a,bVT, A,CVN, x,yV*;

  • а <• b, если и только если существует правило АхаСу  Р и вывод C*bz или вывод C*Dbz, где a,bVT, A,C,DVN, x,y,zV*;

  • а •> b, если и только если существует правило АхСЬу  P и вывод C*za или вывод C*zaD, где a,bVT, A,C,DVN, x,y,zV*.

2. Различные порождающие правила имеют разные правые части, -правила от­сутствуют.

Отношения предшествования для грамматик операторного предшествования определены таким образом, что для них выполняется еще одна особенность — правила грамматики операторного предшествования не могут содержать двух смежных нетерминальных символов в правой части. То есть в грамматике опера­торного предшествования G(VN,VT,P,S), V = VTVN не может быть ни одного правила вида: АхВСу, где A,B,CVN, x.yV* (здесь х и у — это произвольные цепочки символов, могут быть и пустыми).

Для грамматик операторного предшествования также известны следующие свой­ства:

-- всякая грамматика операторного предшествования задает детерминирован­ный КС-язык (но не всякая грамматика операторного предшествования при этом является однозначной!);

-- легко проверить, является или нет произвольная КС-грамматика граммати­кой операторного предшествования (точно так же, как и для простого пред­шествования).

Как и для многих других классов грамматик, для грамматик операторного пред­шествования не существует алгоритма, который бы мог преобразовать произ­вольную КС-грамматику в грамматику операторного предшествования (или до­казать, что преобразование невозможно).

Принцип работы распознавателя для грамматики операторного предшествова­ния аналогичен грамматике простого предшествования, но отношения предшест­вования проверяются в процессе разбора только между терминальными симво­лами.

Для грамматики данного вида на основе установленных отношений предшество­вания также строится матрица предшествования, но она содержит только терми­нальные символы грамматики.

Для построения этой матрицы удобно ввести множества крайних левых и край­них правых терминальных символов относительно нетерминального символа А - Lt(A) или Rt(A):

-- Lt(А) = {t |  A*tz или  A*Ctz }, где tVT, A,CVN, zV*;

-- Rt(A) = {t |  A*zt или  A*ztC }, где tVT, A,CVN, zV*.

Тогда определения отношений операторного предшествования будут выглядеть так:

-- a =• Ь, если  правило Axaby  Р или правило UxaCby, где a,bVT, A,CVN, x,yV*;

-- a <• Ь, если  правило А->хаСу Р и bLt(C), где a,bVT, A,CVN, x,yV*;

-- a •> Ь, если  правило A->xCby  Р и aRt(C), где a.bVT, A.CVN, x,yV*.

В данных определениях цепочки символов x,y,z могут быть и пустыми цепочками.

Для нахождения множеств Lt(A) и Rt(A) предварительно необходимо выпол­нить построение множеств L(A) и R(A), как это было рассмотрено ранее. Далее для построения Lt(A) и Rt(A) используется следующий алгоритм:

Шаг 1.  AVN:

Rt0(A) = {t | AytB или Ayt, tVT, BVN, yV*},

Lt0(A) = {t | ABty или Aty, tVT, BVN, yV*}.

Для каждого нетерминального символа А ищем все правила, содержащие А в ле­вой части. Во множество L(А) включаем самый левый терминальный символ из правой части правил, игнорируя нетерминальные символы, а во множество R(A) — самый крайний правый терминальный символ из правой части правил. Перехо­дим к шагу 2.

Шаг 2.  AVN:

Rti(A) = Rti-1(A)  Rti-1(B),  В  (R(A)  VN),

Lti(A) = Lti-1(A)  Lti-1(B),  В  (L(A)  VN).

Для каждого нетерминального символа А: если множество L(A) содержит нетер­минальные символы грамматики А', А", …, то его надо дополнить символами, входящими в соответствующие множества Lt(A’), Lt(A’’), ... и не входящими в Lt(A). Ту же операцию надо выполнить для множеств R(A) и Rt(A).

Шаг 3. Если  AVN: Rti(A)  Rti-1(A) или Lti(A)  Lti-1(A), то i:=i+1 и вернуться к шагу 2, иначе построение закончено: R(A) = Rti(A) и L(A) = Lti(A).

Если на предыдущем шаге хотя бы одно множество Lt(A) или Rt(A) для неко­торого символа грамматики изменилось, то надо вернуться к шагу 2, иначе по­строение закончено.

Для практического использования матрицу предшествования дополняют симво­лами H и K (начало и конец цепочки). Для них определены следующие отноше­ния предшествования:

H <• а,  aVT, если  S*ax или  S*Cax, где S,CVN, xV* или если aLt(S);

K •> a,  aVT, если  S*xa или  S*xaC, где S,CVN, xV* или если aRt(S).

Здесь S — целевой символ грамматики.

Матрица предшествования служит основой для работы распознавателя языка, заданного грамматикой операторного предшествования. Поскольку она содержит только терминальные символы, то, следовательно, будет иметь меньший размер, чем аналогичная матрица для грамматики простого предшествования. Следует отметить, что напрямую сравнивать матрицы двух грамматик нельзя — не всякая грамматика простого предшествования является грамматикой операторного пред­шествования, и наоборот. Например, рассмотренная далее в примере грамматика операторного предшествования не является грамматикой простого предшество­вания (читатели могут это проверить самостоятельно). Однако если две грамма­тики эквивалентны и задают один и тот же язык, то их множества терминальных символов должны совпадать. Тогда можно утверждать, что размер матрицы для грамматики операторного предшествования всегда будет меньше, чем размер матрицы эквивалентной ей грамматики простого предшествования.

Все, что было сказано выше о способах хранения матриц для грамматик просто­го предшествования, в равной степени относится также и к грамматикам опера­торного предшествования, с той только разницей, что объем хранимой матрицы будет меньше.