Основы конструирования компиляторов

Конструирование таблицы предсказывающего анализатора


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

- правило вывода грамматики и a
FIRST(
). Тогда анализатор делает развертку A по
, если входным символом является a. Трудность

возникает, когда

= e или
*e. В этом случае нужно развернуть A в
, если текущий входной символ принадлежит FOLLOW(A) или если достигнут $ и $
FOLLOW(A).

Алгоритм 4.6. Построение таблицы предсказывающего анализатора.

Вход. КС-грамматика G = (N, T, P, S).

Выход. Таблица M[A, a] предсказывающего анализатора, A

N, a
T
{$}.

Метод. Для каждого правила вывода A

грамматики выполнить шаги 1 и 2. После этого выполнить шаг 3.

  • Для каждого терминала a из FIRST(
    ) добавить A
    к M[A, a].
  • Если e
    FIRST(
    ), добавить A
    к M[A, b] для каждого

    терминала b из FOLLOW(A). Кроме того, если e

    FIRST(
    ) и $
    FOLLOW(A), добавить A
    к M[A, $].
  • Положить все неопределенные входы равными «ошибка».

Пример 4.5. Применим алгоритм 4.6 к грамматике из примера 4.3. Поскольку FIRST(TE') = FIRST(T) = {(, id }, в соответствии с правилом вывода E

TE' входы M[E, ( ] и M[E, id ] становятся равными E
TE'.

В соответствии с правилом вывода E'

+TE' значение M[E', +] равно E'
+TE'. В соответствии с правилом вывода E'
e значения M[E', )] и M[E', $] равны E'
e, поскольку FOLLOW(E') = { ), $}.

Таблица анализа, построенная алгоритмом 4.6 для этой грамматики, приведена на рис. 4.3.



Содержание раздела