Скачиваний:
8
Добавлен:
01.05.2014
Размер:
72.19 Кб
Скачать

Вариант № 3

    1. Описать формальную грамматику, распознающую язык {a^n b^m , где n>m>0}.

Т.е. b всегда должно быть больше, чем a хотя бы на единицу.

S a a E b , Ea E b, E a E, E

    1. Удаление левой рекурсии. Например: G=<{i, , , , (, )},{S, T, P},S,

{S–>ST, S–>T, T–>TP, T–>P, P–>P, P–>(S), P–>i}>

Нетерминал A называется  леворекурсивным , если, применяя к нему одно или более правил, можно вывести цепочку, начинающуюся этим нетерминалом. КС-грамматика, имеющая хотя бы один леворекурсивный нетерминал, называется грамматикой с левой рекурсией . При удалении левой рекурсии входная грамматика должна быть НКС-грамматикой без циклов. (Грамматикой без циклов называется грамматика, не содержащая правила вывод A=>+A). После удаления левой рекурсии в грамматике могут появиться  e -правила и цепные правила.

Алгоритм удаления левой рекурсии :

  • N’=N, R’=0

  • R’={P–>P, P–>(S), P–>i} (T, S – леворекурсивные, в R’ включаем правила, слева в которых – P )

  • R’’={ S–>TS’, S’–>TS’, S’–>e, T–>PT’, T’–>PT’, T’–>e, P–>P, P–>(S), P–>i }

  • N’=N{S’, T’}

2. Построить расширенный МП-преобразователь :{W2W^r , где Wпринадлежит {0,1}*}

W^r инверсия к W

S  0 S 0, S  1 S 1, S  2

а) (q, a,  ) = {(q, a)} a{0, 1, 2}

б)  (q, ,  ) = {(q, S)}

 (q, , 0 S 0 ) = {(q, S)}

 (q, , 1 S 1 ) = {(q, S)}

 (q, , 2 ) = {(q, S)}

в)  (q, , S ) = {(r, )}

Пример разбора входной цепочки:

(q, 01210, )(q, 1210, 0)(q, 210, 01)(q, 10, 012)(q, 10, 01S)(q, 0, 01S1)(q, 0, 0S)

(q, , 0S0)(q, , S)(r, ,)

3. AТ-грамматику (присваивание). Справа могут быть простые переменные,

константы, + , - , / , ( , ).

VARt

переменная

t – синтезированный

Et

выражение

t – синтезированный

OPN  VARp1 := Eq1 {присвоить}p2,q2

p2p1 Типы p2 и q2 должны совпадать. Переменной по адресу p2

q2q1 присваивается значение по адресу q2.

{присвоить}A1,A2

Если типы А1 и А2 совпадают,

то генерируется триада := A1, A2

:= A1, A2

Переменной по адресу A1 в таблице идентификаторов присваивается значение по адресу A2 из таблицы промежуточных значений.

Аномальная ситуация: если типы А1 и А2 не совпадают.

Подграмматика для выражения:

Нетерминалы:

EARt

арифметическое выражение

t - синтезированный

Tt

терм

t - синтезированный

T`p,t

остаток терма

p - унаследованный, t - синтезированный

Pt

произведение

t - синтезированный

P`p,t

остаток произведения

p - унаследованный, t - синтезированный

Ft

фактор

t - синтезированный

Используем как терминал:

VARt

переменная

t – синтезированный

EARt2  + Tt1

t2t1

EARt2   Tt1 {поменять_знак}t1

t2t1

EARt2  Tt1

t2t1

Tt2  Pp1 T`p2,t1

p2p1

t2t1

T`p1,t2  + Pq1 {сложить}p2,q2,r2 T`r2,t1

r1,r2НОВЭЛТ

p2p1

q2q1

t2t1

T`p1,t2   Pq1 {вычесть}p2,q2,r2 T`r2,t1

r1,r2НОВЭЛТ

p2p1

q2q1

t2t1

T`p1,p2  

p2p1

Pt2  Fp1 P`p2,t1

p2p1

t2t1

P`p1,t2  * Fq1 {умножить}p2,q2,r1 P`

r1,r2НОВЭЛТ

p2p1

q2q1

t2t1

P`p1,t2  / Fq1 {делить}p2,q2,r1 P`r2,t1

r1,r2НОВЭЛТ

p2p1

q2q1

t2t1

P`p1,p2  

p2p1

Ft2  cnst1

t2t1 t1 – значение константы

Ft2  ( EARt1 )

t2t1

Ft2  VARt1

t2t1 t1 – значение переменной

НОВЭЛТ - процедура, которая выдает значение указателя на свободную позицию таблицы, используемой для запоминания результата.

Операционные символы:

{сложить}A1,А2,R

R = адрес триады, сгенерированной

в соответствии с таблицей 5

{вычесть}A1,А2,R

R = адрес триады, сгенерированной

в соответствии с таблицей 6

{умножить}A1,А2,R

R = адрес триады, сгенерированной

в соответствии с таблицей 7

{делить}A1,А2,R

R = адрес триады, сгенерированной

в соответствии с таблицей 8

Таблицы: см. Вариант № 7 (3) Все переведено в триады.

  1. LL(1)-анализ.

S → AB (1) Пример:

S → bC (2)

A → a (3)

A → ε (4)

B → cD (5)

B → ε (6)

C → AD (7)

C → c (8)

D → d (9)

Проверка: грамматика является LL(l)-грамматикой, когда для множества правил A→1|2|…|n

множества ПЕРВ(1), ПЕРВ(2),…, ПЕРВ(n) попарно не пересекаются.

Построение управляющей таблицы.

Управляющая таблица строится на множестве (NT{}) х (T{ ε }).

В исходной таблице строки пронумеруем элементами (NT{}), столбцы – терминальными символами (и ε).

1-ое правило: S → AB ПЕРВ(S)= {a, ε, c} Т.е. для а, ε ,c правило 1.

Т.к. из S можно вывести ε, то нужно найти СЛЕД(S)= { ε }

2-ое правило: S → bC ПЕРВ(S)= {b } Т.е. для b правило 2.

3-ое правило: A → a ПЕРВ(A)= {a } Т.е. для a правило 3.

4-ое правило: A →ε СЛЕД(А)= {c,d} Т.е. для c, d, ε правило 4.

5-ое правило: B → cD ПЕРВ(B)= {c } Т.е. для c правило 5.

6-ое правило: B → ε СЛЕД(B)= { ε } Т.е. для ε правило 6.

7-ое правило: C → AD ПЕРВ(C)= {a, d} Т.е. для а, d правило 7.

8-ое правило: C → c ПЕРВ(C)= {c} Т.е. для c правило 8.

9-ое правило: D → d ПЕРВ(D)= {d} Т.е. для d правило 9.

X \ a

b

a

c

d

Eps

S

bC,2

AB,1

AB,1

AB,1

A

a,3

ε,4

ε,4

ε,4

B

cD,5

ε,6

C

AD,7

c,8

AD,7

D

d,9

b

ВЫБРОС

a

ВЫБРОС

c

ВЫБРОС

d

ВЫБРОС

ДОПУСК

X – верхний символ магазина, a – текущий символ входной цепочки

Пример разбора цепочек:

1. abcd

(abcd, S, ) →(abcd, AB,1) →(abcd, aB,13) →(bcd, B,13) →ОШИБКА

2. bad

(bad, S, ) →(bad, bC, 2) →(ad, C, 2) →(ad, AD, 27) →(ad, aD, 273) →(d, D, 273) →

(d, d, 2739) →( ε, , 2739) →ДОПУСК

Соседние файлы в папке variaNTS