Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
11_транс_1.doc
Скачиваний:
37
Добавлен:
30.11.2018
Размер:
167.94 Кб
Скачать

Нисходящий алгоритм Эрли

Алгоритм Эрли – это классический нисходящий алгоритм синтаксического анализа, применимый ко всем КС-грамматикам. Это один из самых эффективных общих алгоритмов. Этот алгоритм пытается построить все возможные нетерминалы из подстрок входной строки. Читая входную строку символ за символом, алгоритм для каждой позиции входной строки формирует список всех тех частично завершённых правил грамматики, из которых прочтённый префикс входной строки и его части могут быть выведены и после чтения очередного символа этот список модифицируется.

Входная строка a1 a2 a3 … an читается слева направо. Для каждого символа ai строится множество ситуаций Mi, определяющее состояние распознавателя после анализа этого символа. Ситуации это:

  1. Помеченное правило грамматики Pr  R, согласно которому в данный момент считывается сегмент входной цепочки, выводящийся в соответствии с правилом Pr.

  2. Место в правиле Pr, показывающее, какая доля правой части этого правила уже распознана (отмечается мета-символом ).

  3. Указатель позиции во входной цепочке, после которого начался поиск возможности применения этого правила.

Для удобства дополним грамматику правилом S#S#, где S - новый нетерминал, а # - дополнительные терминальные скобки, в которые будет помещаться каждая терминальная строка, порождаемая исходной грамматикой. Тогда начальное множество ситуаций M0 = {<S#S#; 0>}.

Множество ситуаций изменяется операторами:

Предсказатель. Если во множестве ситуаций Mi есть ситуация <AB; q>, то предсказатель добавляет в Mi ситуации <B; i> для всех правил грамматики вида B. Назовём ситуацию <AB; q> родительской, ситуацию <B; i> - порождённой.

Считыватель. Если в Mi есть ситуация <Ab; q> и если b – очередной символ ai+1, то в Mi+1 добавляет ситуацию <Ab; q>

Завершитель. Применяется к любой ситуации вида <A; q> в Mi. В Mq завершитель ищет ситуацию <A; q>, и для каждой ситуации <BA; s>, которая является родительской для <A; q>, в Mi он добавляет новую ситуацию <BA; s>

Эти три оператора применяются до тех пор, пока Mi и Mi+1 не стабилизируются, а затем считывается новый символ и всё повторяется. Входная цепочка будет распознана, если в заключительном множестве будет содержаться ситуация вида <S#S#; 0>

Пример.

Дана грамматика S#E# EE+T | T TT*P | P Pa

Рассмотрим цепочку #a+a# и построим множество ситуаций.

#

a

+

a

#

M0

M1

M2

M3

M4

M5

S#E# ; 0

S#E# ; 0

Pa ; 1

EE+T ; 1

Pa ; 3

S#E# ; 0

EE+T ; 1

TP ; 1

TT*P ; 3

TP ; 3

ET ; 1

TT*P ; 1

TP ; 3

TT*P ; 3

TT*P ; 1

ET ; 1

Pa ; 3

EE+T ; 1

TP ; 1

EE+T ; 1

EE+T ; 1

Pa ; 1

S#E# ; 0

S#E# ; 0

Если из этих множеств удалить несущественные ситуации, то получим множества существенных ситуаций:

#

a

+

A

#

M0

M1

M2

M3

M4

M5

S#E# ; 0

S#E# ; 0

Pa ; 1

EE+T ; 1

Pa ; 3

S#E# ; 0

EE+T ; 1

TP ; 1

TP ; 3

ET ; 1

TP ; 3

ET ; 1

Pa ; 3

EE+T ; 1

TP ; 1

EE+T ; 1

Pa ; 1

S#E# ; 0

Теорема.

Ситуация <A; i> находится во множестве Mi тогда и только тогда, когда существует вывод SA такой, что a1a2…ai и ai+1ai+2… aj

Алгоритм Эрли имеет временную сложность O(n3) и пространственную сложность O(n2). Для недвусмысленной грамматики временная сложность составляет O(n2).

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