Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Автомат для грамматики





Для определенной нами грамматики автомат получится следующим:

x

 
 


x S

 

S (x (

 

,

           
 
   
   
 
 

 

 


S L

 

)

       
   

 

 


где состояния определяются следующим образом:

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:

  ( ) x , $ S L
  s2   s2        
  r2 r2 r2 r2 r2    
  s2   s1        
          acc    
    s5   s7      
  r1 r1 r1 r1 r1    
  r3 r3 r3 r3 r3    
  s3   s2        
  r4 r4 r4 r4 r4    

 

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) ET

(2) ET

(3) TT*F

(4) TF

(5) F(E)

(6) Fid

 

Управляющая таблица для такой грамматики выглядит следующим образом:

 

Состо-яние action goto
id + * () $ E T F
  s5 s4 1 2 3
  s6 accept  
  r2 s7 r2 r2  
  r4 r4 r4 r4  
  S5 s4 8 2 3
  r6 r6 r6 r6  
  s5 s4 9 3
  s5 s4  
  s6 s11  
  r1 s7 r1 r1  
  r3 r3 r3 r3  
  r5 r5 r5 r5  

 

Как обычно,

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-анализатора:

 

State action goto
a b $ S A
  s3 s4 1 2
  accept  
  s6 s7  
  s3 s4  
  r3 r3  
  r1  
  s6 s7  
  r2 r2  
  r2  

 

Нетрудно заметить, что пары состояний 3 и 6, 4 и 7, 8 и 9 различаются только вторыми компонентами, определяющих их ситуаций. Поэтому мы можем «склеить» эти пары. В результате получится таблица LALR-анализатора:

 

State action goto
a b $ S A
  s36 s47 1 2
  accept  
  s36 s47  
  s36 s47  
  r3 r3 r3  
  r1  
  r2 r2 r2  

 

Date: 2016-05-25; view: 453; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.008 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию