![]() Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
![]() Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
![]() |
Автомат для грамматикиСтр 1 из 56Следующая ⇒
Для определенной нами грамматики автомат получится следующим:
)
где состояния определяются следующим образом: 0: {[S'.S], [S →. x], [S →. (L)]} 1: {[S → x.]} 2: {[S → (.L)], [L →. L,S], [L →. S], [S →. (L)], [S →. x]} 3: {[S' → S.] 4: {[S → (L.)], [L → L., S]} 5: {[S → (L).]} 6: {[L → S.]} 7: {[L → L,.S], [S →. (L)], [S →. x]} 8: {[L → L,S.]}
Управляющая таблица
Теперь мы можем вычислить множество сверток R:
R = empty set; for (each state I in T) { for (each item [A->w.] in I) { R+={(I, A->w)}; } }
Таким образом, алгоритм построения управляющей таблицы автомата состоит из следующих шагов: · Пополнение грамматики · Построение множества состояний · Построение множества переходов · Построение множества сверток
Для того, чтобы построить таблицу анализатора для грамматики, поступим следующим образом:
1. для каждого ребра I→X J мы поместим в позицию [ I, X ] таблицы · shift J, если X – терминал, · goto J, если X – нетерминал. 2. для каждого состояния I, содержащего ситуацию [ S'→S. ] мы поместим accept в позицию [ I, $ ] 3. для состояния, содержащего ситуацию [ A→w. ] (правило номер n с точкой в конце правила), поместим reduce n в позицию [ I, Y ] для каждого терминала Y. 4. пустая ячейка означает ошибочную ситуацию
Приведем управляющую таблицу для грамматики G0:
LR(1)-анализатор
LR(1)-анализатор использует для принятия решения один символ входной цепочки. Алгоритм построения управляющей таблицы LR(1)-анализатора подобен уже рассмотренному алгоритму для LR (0)-анализатора, но понятие ситуации в LR(1)-анализаторе более сложное: LR(1)-ситуация состоит из правила грамматики, позиции правой части (представляемой точкой) и одного символа входной строки (lookahead symbol). LR(1)-ситуация выглядит следующим образом: [ A→w1. w2, a ], где a – терминальный символ. Ситуация [ A→w1 .w2, a ] означает, что цепочка w1 находится на вершине магазина, и префикс входной цепочки выводим из цепочки w2 x. Как и прежде, состояние автомата определяется множеством ситуаций. Для построения управляющей таблицы необходимо переопределить базовые операции closure и goto.
closure (I) { do { Iold=I; for (каждой ситуации [A->w1.Xw2, z] из I) for (любого правила X->u) for (любой цепочки w, принадлежащей FIRST (w2 z)) I+=[X->.u, w]; } while (I!= Iold); return I; } goto (I, X) { J = {}; for (каждой ситуации [A->w1.Xw2, z] из I) J+=[A->w1 X.w2, z]; return closure (J); } Естественно, операция reduce также зависит от символа входной цепочки:
R=[] foreach (I из T) foreach ([A->w., z] из I) R+={(I, z, A->w)} Тройка (I, z, A→w) означает, что в состоянии I для символа z входной цепочки анализатор будет осуществлять свертку по правилу A→w. Управляющая таблица LR(1)-анализатора
Пример. Рассмотрим грамматику: (1) E → T (2) E → T (3) T → T*F (4) T → F (5) F → (E) (6) F → id
Управляющая таблица для такой грамматики выглядит следующим образом:
Как обычно, si – перенос и переход в состояние i ri – свертка по правилу i i – переход в состояние i LALR(1)-анализатор
Таблицы LR(1)-анализатора могут оказаться очень большими, ведь даже маленькая грамматика нашего примера привела к автомату с двенадцатью состояниями. Таблицы меньшего размера можно получить путем слияния любых двух состояний, которые совпадают с точностью до символов входной строки (lookahead symbols).
Пример. Рассмотрим грамматику G1 с правилами: S → AA A → aA A → b Пополним эту грамматику правилом S' → S. Для этой грамматики мы получим следующие состояния:
0: { [S'→.S, $], [S→.AA, $], [A→.aA, a], [A→.aA, b], [A→.b, a], [A→.b, b] } 1: { [S'→S., $] } 2: { [S'→A.A, $], A→.aA, $], [A→.b, $] } 3: { [A→a.A, a], [A→a.A, b], [A→.a.A, a], [A→.a.A, b], [A→.b, a], [A→.b, b] } 4: { [A→b., a], [A→b., b] } 5: { [S→AA. $] } 6: { [A→a.A, $], [A→.aA, $], [A→.b, $] } 7: { [A→b., $] } 8: { [A→aA.,a], [A→aA.,b] } 9: { [A→aA.,$] }
Граф переходов выглядит так:
Таблица LALR-анализатора для грамматики G1
Теперь можно построить таблицу LR-анализатора:
Нетрудно заметить, что пары состояний 3 и 6, 4 и 7, 8 и 9 различаются только вторыми компонентами, определяющих их ситуаций. Поэтому мы можем «склеить» эти пары. В результате получится таблица LALR-анализатора:
Date: 2016-05-25; view: 499; Нарушение авторских прав |