Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы построения анализаторов из учебника.doc
Скачиваний:
49
Добавлен:
01.05.2014
Размер:
441.34 Кб
Скачать

Описание алгоритма

1) Функция переноса f определяется по отношениям пред­шествования на множестве (V { })(T { }) ( за исключением правила с), которое имеет приоритет над правила­ми а) и b), когда Х = S и a = ) по отношениям предшествования следующим образом:

а) f (X, а) = ПЕРЕНОС, если X <• a или X a ;

  1. f (X, а) = СВЕРТКА, если X> a;

  2. f(S, ) = ДОПУСК;

2) Функция свертки g определяется так, чтобы при свертке применялось самое длинное правило из списка альтернатив.

а) g(X,) = i, если B R и имеет номер i и в R нет правила вида

A X;

  1. g() = ОШИБКА во всех остальных случаях.

Пример

E  E + T

E  T

T  TP

T  P

P  (E)

P  i

E

T

P

i

(

)

+

*

T

•

•

•

P

•

•

•

•

i

•

•

•

•

(

<• 

<•

<•

<•

<•

)

•

•

•

•

+

<

<•

<•

<•

*

<•

<•

<•

<•

<•

<•

<•

f(X,a)

i

(

)

+

*

E

П

П

T

С

С

П

С

P

С

С

С

С

i

С

С

С

С

(

П

П

)

С

С

С

С

+

П

П

*

П

П

П

П

E

Д

g()

X

(

E+T

1

E+T

1

(

T

2

T

2

(

T*P

3

+

T*P

3

T*P

3

(

P

4

+

P

4

P

4

(

(E)

5

+

(E)

5

*

(E)

5

(E)

5

(

i

6

+

i

6

*

i

6

i

6

Последовательность тактов, которую выполнит анализатор при разборе входной цепочки i+i*i, имеет следующий вид:

(, i+i*i, ) #s (i, +i*i, ) #r (P, +i*i, 6) #r (T, +i*i, 64) #r (E, +i*i, 642) #s

(E+, i*i, 642) #s (E+i, *i, 642) #r (E+P, *i, 6426) #r (E+T, *i, 64264) #s

(E+T*, i, 64264) #s (E+T*i, , 64264) #r (E+T*P, , 642646) #r

(E+T, , 6426463) #r (E, , 64264631) #s ДОПУСК

Операторной грамматикой

называется приведенная КС-грамматика без -правил, правые части правил которой не содержат смежных нетерминалов.

Для операторной грамматики отношения предшествования можно за­дать на множестве (T  { } )  (T  { } ). Пусть C N  { }. Тогда

  1. a b, если A  aCb  R;

  2. a <• b, если A  aB  R и B + Cb;

  3. <• a, если S + Ca;

  4. a •> b, если A  Bb  R и B + aC;

  5. a •>, если S + aC.

пример

E  E + T

E  T

T  TP

T  P

P  (E)

P  i

(

i

*

+

)

(

<

<

<

<

i

•>

•>

•>

•>

*

<

<

•>

•>

•>

•>

+

<

<

•>

•>

•>

•>

)

•>

•>

•>

•>

<

<

<

<

Остовной грамматикой для грамматики G на­зовем грамматику Gs = < T, {S}, S, R' >, множество правил R'ко­торой строится следующим образом:

1) если в R есть правило А Y1Y2 Ym, то в R' включается правило S X1X2 Xm, где

а) Xi = Yi, если Yi T,

б) Xi = S, если Yi N;

2) в R' не должно быть правил вида S S.

Вход. Грамматика операторного предшествования G = < T, N, S, R >.

Выход. Алгоритм разбора A = (f, g) типа “перенос – свертка” для остовной грамматики Gs.

Описание алгоритма.

Пусть С = { S, }.

1) Функция переноса f определяется по отношениям опера­торного предшествования следующим образом:

а) f(aC, b) = ПЕРЕНОС, если a <• b или a b;

б) f(aC, b) = СВЕРТКА, если a •> b;

в) f(S, ) = ДОПУСК;

г) f(, w) = ОШИБКА в остальных случаях.

2) Функция свертки вычисляется так:

а) g(aCb, w) = i, если а <• b, отношение выполняется для всех соседних терминалов цепочки , если они существуют, и S Cb – правило с номером i грамма­тики Gs.

б) g(a, w) = ОШИБКА в остальных случаях.

Пример

Остовная грамматика G0s для грамматики G0 имеет вид

E  E + E

E  E * E

E  (E)

E  i

(

i

*

+

)

(

П

П

П

П

П

i

С

С

С

С

*

П

П

С

С

С

С

+

П

П

П

С

С

С

)

С

С

С

С

П

П

П

П

E

П

П

П

П

Д

g()

(E+E

1

E+E

1

(E*E

3

+E*E

3

E*E

3

((E)

5

*(E)

5

+(E)

5

(E)

5

(i

6

*i

6

+i

6

i

6

i + i * i, имеет следующий вид:

( , i+i*i, ) #s ( i, +i*i, ) #r ( E, +i*i, 6 ) #s ( E+, i*i, 6 ) #s

( E+i, i, 6 ) #r ( E+E, i, 66 ) #s ( E+E*, i, 66 ) #s ( E+E*i, , 66 ) #r

( E+E*E, , 666) #r ( E+E, , 6663) #r ( E, , 66631) #s ДОПУСК