Если нужно, вызывается семантическая подпрограмма, соответствующая правилу (1), которая обрабатывает строку х, переводя ее на выходной язык. Семантическая подпрограмма учитывает как терминальные, так и нетерминальные символы первичной фразы, поэтому в ней можно предусмотреть возможность устранения неоднозначности разбора.
Затем
в стеке строка х заменяется символом , и
описанный выше процесс продолжается. Состояние стека и входной строки может
быть, например, таким, как показано на рис.2. Буквами S
обозначены нетерминальные символы, а буквами t терминальные.
Если
на некотором шаге процесса синтаксического анализа обнаружится, что между
двумя последовательными терминальными символами и
(которые могут быть разделены нетерминальным
символом) не существует отношения предшествования, то это свидетельствует об
ошибке типа: «конструкция
...
недопустима».
Описанный алгоритм реализуется в трансляторе почти так же, как общий алгоритм метода предшествования, но матрица предшествования получается гораздо меньших размеров.
Для отыскания отношений операторного предшествования удобно ввести множество самых левых терминальных символов Lt(U) и множество самых правых терминальных символов Rt(U) относительно нетерминального символа U.
Пусть t - терминальный символ, x, y и z - любые строки, быть может, пустые, С — нетерминальный символ, L(U') - множество самых левых, а K(U') - множество самых правых символов относительно нетерминального символа U', тогда
(2)
или
. (3)
(4)
или
(5)
Формулы (2) и (3) являются определениями множеств Lt и Rt, а эквивалентные формулы (4) и (5) фактически определяют алгоритм отыскания множеств Lt и Rt.
Определения отношений операторного предшествования можно записать так:
1. (6)
2.
(7)
3.
(8)
Эти формулы удобнее для практического применения.
ПримерНайти матрицу и функции операторного предшествования для грамматики G1:
ПВ
ВT
BB
T
TT
M
МИ
М(В)
Решение Нетерминальные символы грамматики G1:
П, В, Т, М, а
терминальные – ,
,
, И,
(,).
Матрицу операторного предшествования можно наши в следующем порядке.
1 Для каждого нетерминального символа U грамматики G1 отыскиваются множества Lt(U) и Rt(U). Для этого:
1.1. Отыскиваются множества L(U) и R(U)
1.2. Для каждого нетерминального символа U:
а) отыскиваются правила грамматики G1 с правыми частями вида tzи Ctz. Терминальные символы t фиксируются в качестве элементов множества Lt(U);
б) отыскиваются правила с правыми частями вида zt и ztC. Терминальные символы tфиксируются в качестве элементов множества Rt(U).
В результате получается таблица:
Таблица 1:
Множества Lt(U) и Rt(U) после выполнения
первого шага алгоритма
U |
Lt(U) |
Rt(U) |
П |
|
|
В |
|
|
Т |
|
|
М |
И, ( |
И, ) |
1.3. Для каждого нетерминального символа U:
а)
просматривается множество L(U) и
отыскиваются входящие в него нетерминальные символы Затем
множество Lt(U) дополняется
символами, входящими в
и не входящими в Lt(U);
б)
просматривается множество R(U) и
отыскиваются входящие в него нетерминальные символы Затем
множество Rt(U) дополняется
символами, входящими в
и не входящими в Rt(U);
В результате получается табл. 2:
Таблица 2:
Множества Lt(U) и Rt(U) (окончательная таблица)
U |
Lt(U) |
Rt(U) |
П |
|
|
В |
|
|
Т |
|
|
М |
(, И |
), И |
2. Составляется матрица операторного предшествования. Для этого просматриваются правые части порождающих правил грамматики G1.
2.1.
По правилу (6) определяются отношения
2.2. По правилу (7) с использованием табл. 2 определяются отношения <·.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.