Теория формальных языков, грамматик и автоматов. Ишакова Е.Н. - 41 стр.

UptoLike

Составители: 

41
- если не установлено ни одно отношение предшествования между те-
кущим символом входной цепочки и самым верхним символом в стеке, то ал-
горитм прерывается сообщением об ошибке;
-
если в стеке остаются символы
н
S, а во входном буфере только сим-
вол
к
, то входная строка прочитана полностью, и алгоритм разбора завершен
успешно.
Пример 7.1. Дана грамматика G({a, (, )}, {S, R}, P, S), с правилами P:
1) S(R | a; 2) RSa). Построить распознаватель для строки (((aa)a)a)
к
.
Этап 1. Построим множества крайних левых и крайних правых символов
L(A) и R(A) относительно всех нетерминальных символов грамматики (таблица
7.1).
Таблица 7.1 – Построение множеств L(A) и R(A) для грамматики G
Шаг L
i
(A) R
i
(A)
0
L
0
(S)={(, a}
L
0
(R)={S}
R
0
(S)={R, a}
R
0
(R)={)}
1
L
1
(S)={(, a}
L
1
(R)={S, (, a}
R
1
(S)={R, a, )}
R
1
(R)={)}
2
L
2
(S)={(, a}
L
2
(R)={S, (, a}
R
2
(S)={R, a, )}
R
2
(R)={)}
Результат
L(S)={(, a}
L(R)={S, (, a}
R(S)={R, a, )}
R(R)={)}
Этап 2. На основе построенных множеств и правил вывода грамматики
составим матрицу предшествования символов (таблица 7.2).
Поясним заполнение матрицы предшествования. В правиле грамматики
S(R символ ( стоит слева от нетерминального символа R. Во множестве L(R)
входят символы S, (, a. Ставим знак <
в клетках матрицы, соответствующих
этим символам, в строке для символа (.
В правиле грамматики RSa) символ a стоит справа от нетерминального
символа S. Во множество R(S) входят символы R, a, ). Ставим знак
> в клетках
матрицы, соответствующих этим символам, в столбце для символа a.
В строке символа
н
ставим знак <
в клетках символов, входящих во
множество L(S), т.е. символов (, a. В столбце символа
к
ставим знак
> в клет-
ках, входящих во множество R(S), т.е. символов R, a, ).
В клетках, соответствующих строке символа S и столбцу символа a, ста-
вим знак =
, т.к. существует правило RSa), в котором эти символы стоят ря-
дом. По тем же соображениям ставим знак =
в клетках строки а и столбца ), а
также строки ( и столбца R.
     - если не установлено ни одно отношение предшествования между те-
кущим символом входной цепочки и самым верхним символом в стеке, то ал-
горитм прерывается сообщением об ошибке;
     - если в стеке остаются символы ⊥нS, а во входном буфере только сим-
вол ⊥к, то входная строка прочитана полностью, и алгоритм разбора завершен
успешно.
     Пример 7.1. Дана грамматика G({a, (, )}, {S, R}, P, S), с правилами P:
1) S→(R | a; 2) R→Sa). Построить распознаватель для строки (((aa)a)a)⊥к.
      Этап 1. Построим множества крайних левых и крайних правых символов
L(A) и R(A) относительно всех нетерминальных символов грамматики (таблица
7.1).
        Таблица 7.1 – Построение множеств L(A) и R(A) для грамматики G
  Шаг                     Li(A)                             Ri(A)
                      L0(S)={(, a}                     R0(S)={R, a}
    0
                      L0(R)={S}                        R0(R)={)}
                      L1(S)={(, a}                     R1(S)={R, a, )}
    1
                      L1(R)={S, (, a}                  R1(R)={)}
                      L2(S)={(, a}                     R2(S)={R, a, )}
    2
                      L2(R)={S, (, a}                  R2(R)={)}
                      L(S)={(, a}                      R(S)={R, a, )}
Результат
                      L(R)={S, (, a}                   R(R)={)}
      Этап 2. На основе построенных множеств и правил вывода грамматики
составим матрицу предшествования символов (таблица 7.2).
      Поясним заполнение матрицы предшествования. В правиле грамматики
S→(R символ ( стоит слева от нетерминального символа R. Во множестве L(R)
входят символы S, (, a. Ставим знак <⋅ в клетках матрицы, соответствующих
этим символам, в строке для символа (.
      В правиле грамматики R→Sa) символ a стоит справа от нетерминального
символа S. Во множество R(S) входят символы R, a, ). Ставим знак ⋅> в клетках
матрицы, соответствующих этим символам, в столбце для символа a.
      В строке символа ⊥н ставим знак <⋅ в клетках символов, входящих во
множество L(S), т.е. символов (, a. В столбце символа ⊥к ставим знак ⋅> в клет-
ках, входящих во множество R(S), т.е. символов R, a, ).
      В клетках, соответствующих строке символа S и столбцу символа a, ста-
вим знак =⋅, т.к. существует правило R→Sa), в котором эти символы стоят ря-
дом. По тем же соображениям ставим знак =⋅ в клетках строки а и столбца ), а
также строки ( и столбца R.




                                                                              41