Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_YaPiMT_ispravlennoe.docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
272.13 Кб
Скачать

Матрица предшествования

Отношение предшествования можно непосредственно найти, пользуясь определением. Однако, удобнее ввести дополнительное определение. Обозначим L(u) – множество самых левых символов относительно нетерминального символа U. Формально множество L(U) определяемая формулой L(U)={ S| u=>*Sz},где z – ЛЮБАЯ строка, возможно пустая.

Или: L(u)={S| (U->Sz)v (U->U'z'^S L(U'))}

Аналогично обозначим R(u) – множество самых правых символов относительно нетерминального символа U. R(U)={ S| |U=>*zS}

Или: R(U)={S| (U->zS)v (U ->z'U'^S R(U'))}

Эти 2 определения удобны для практического поиска множеств L(U) и R(U), которые используются для выявления отношений предшествования по следующим правилам:

  1. Si Sj  (U->xSiSjy) (1)

  2. Si Sj  (U->xSiDy)^Sj L(D) (2)

  3. Si Sj  (U->xCSjy)^Si R(C)v (U->xCDy) Si R (C)^Sj L(D) (3)

Здесь С и D нетерминальные символы, а х и у – цепочки, возможно пустые.

Пример1: Найти L(u) и R(u) для грамматики G1:

П -> В X

В-> T

B-> B+T

T->M (4)

T->TxM

M-> U

M-> (B)

Решение: нетерминальные символы грамматики G1: П, В, Т, М. Множества L(u) и R(u) нужно построить только для этих символов.

  1. Для каждого нетерминального символа U находим все правила, содержащие U в левой части. В L(U) включается самый левый символ правой части каждого правила, а в R(U) – самый правый символ.

В результате получаем:

Множества L(u) и R(u) на 1 шаге:

u

L(u)

R(u)

П

В

Т

М

T, В

М, Т

u, (

T

M

u, )

  1. Просматривается каждое полученной множестве (см. рис.). Если множество L(u) содержит нетерминальные символы u',u'',…, то это множество дополняется символами, входящими в L(u'),L(u''),… и не входящими в L(u). Аналогичным образом дополняется множество R(u).

Имеем:

u

L(u)

R(u)

П

В

Т

М

T,B,М

M,Т,u,(

u, (

T,М

M,u,)

u, )

  1. Выполнение шага 2 продолжается до тех пор, пока множества L(u) и R(u) не перестанут изменятся. В результате:

u

L(u)

R(u)

П

В

Т

М

T,B,М,u,(

T,M,u,(

u, (

T,М,u,)

M,u,)

u, )

Окончательная таблица

Грамматика G1 не является грамматикой предшествования, т.к. из (1) и (4): ( В(входят в основу и стоят рядом), + Т, а с другой стороны из (2) и (3), и таблицы => ( B и + T, т.е. отношения предшествования для пар символов (, И и +Т неоднозначны.

Неоднозначность отношений предшествования, встречаются в грамматиках языков программирования, в следствии того, что для выделении основы в методе предшествования используется минимальный контекст: сравниваются лишь пары символов. Для устранения неоднозначности, если она появляется, нужно либо изменить грамматику, либо использовать более далёкий контекст. Так, очевидно, в контексте ( В ) и В+Т+… справедливо соответственно: ( В и + Т, поскольку возможны прямые редукции В к М и В+Т к В, то в контексте (В+Т) и … +ТхМ, напротив, справедливы отношения ( В и + Т (ввиду того, что здесь нужно выполнить прямые редукции В+Т к В и ТхМ к Т).

В данном конкретном случае формально неоднозначность отношений предшествования вытекает из того, что, с одной стороны символы (, В, а также + и Т встречаются в правых частях правил рядом, а с другой стороны B L(B) и T L(T). Если устранить рекурсивность множеств L(B) и L(T) относительно В и Т, то рассматривается грамматика станет грамматикой простого предшествования.

Заменим правила B->T и В->В+Т правилами

B->B'

B'->T

B'->B'+T,

и T->M., T->TxM правилами

T->T'

T'->M

T'->T'xM

Получим новую грамматику G'(эквивалентную):

П -> В

В-> B'

B'-> T

B'-> B'+T

T->T' (5)

T'->M

T'->T'xM

M-> u

M-> (B) – грамматика простого предшествования.

Отношения предшествования удобно записывать в виде матрицы предшествования, представляющей собой таблицу с двумя входами. Входами в таблицу являются предшествующий (Si) и последующий (Sj) символы приводимой строки, а в ее клетках записываются отношения предшествования.

Составим матрицу предшествования для грамматики G'1.

  1. Находим L(u) и R(u) по старому алгоритму.

    u

    L(u)

    R(u)

    П

    В

    B'

    Т

    T'

    М

    B',T,T',М, u,(

    T, B', T', M, u,(

    T’, M, u,(

    M, u, (, Т'

    u, (

    B',T,T',М, u,)

    T, T', M, u, )

    T, M, u,)

    M, u, )

    u, )

  2. Составляем матрицу предшествования.

      1. Отношения отыскиваем по (1) правилу непосредственных просмотром правых частей грамматики(4). Символы, стоящие в правой части рядом, связаны отношением .

      2. Отношения отыскиваем по правилу (2) путём просмотра правых частей порождающих грамматик G'1 с использованием таблицы, содержащей описания множеств L(D). Например, из правил T'->T'xM и L(M)={u,(} =>x u и x (.

      3. Отношения > находим по правилу (3) путём просмотра правых частей G'1с использованием таблицы, содержащей описания множеств L(D) и R(C).

В результате выполнения этого алгоритма получается матрица предшествования.

Sj

Si

(

u

M

x

T'

T

+

B'

)

B

)

U

M

x

T'

T

+

B'

B

(

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]