Решенные задачи на экзамен Опалевой / variaNTS / VAR_3
.DOC
Вариант № 3
-
Описать формальную грамматику, распознающую язык {a^n b^m , где n>m>0}.
Т.е. b всегда должно быть больше, чем a хотя бы на единицу.
S a a E b , Ea E b, E a E, E
-
Удаление левой рекурсии. Например: G=<{i, , , , (, )},{S, T, P},S,
{S–>ST, S–>T, T–>TP, 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
p2p1 Типы p2 и q2 должны совпадать. Переменной по адресу p2
q2q1 присваивается значение по адресу 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
t2t1
EARt2 Tt1 {поменять_знак}t1
t2t1
EARt2 Tt1
t2t1
Tt2 Pp1 T`p2,t1
p2p1
t2t1
T`p1,t2 + Pq1 {сложить}p2,q2,r2 T`r2,t1
r1,r2НОВЭЛТ
p2p1
q2q1
t2t1
T`p1,t2 Pq1 {вычесть}p2,q2,r2 T`r2,t1
r1,r2НОВЭЛТ
p2p1
q2q1
t2t1
T`p1,p2
p2p1
Pt2 Fp1 P`p2,t1
p2p1
t2t1
P`p1,t2 * Fq1 {умножить}p2,q2,r1 P`
r1,r2НОВЭЛТ
p2p1
q2q1
t2t1
P`p1,t2 / Fq1 {делить}p2,q2,r1 P`r2,t1
r1,r2НОВЭЛТ
p2p1
q2q1
t2t1
P`p1,p2
p2p1
Ft2 cnst1
t2t1 t1 – значение константы
Ft2 ( EARt1 )
t2t1
Ft2 VARt1
t2t1 t1 – значение переменной
НОВЭЛТ - процедура, которая выдает значение указателя на свободную позицию таблицы, используемой для запоминания результата.
Операционные символы:
{сложить}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 5 |
{вычесть}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 6 |
{умножить}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 7 |
{делить}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 8 |
Таблицы: см. Вариант № 7 (3) Все переведено в триады.
-
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) попарно не пересекаются.
Построение управляющей таблицы.
Управляющая таблица строится на множестве (NT{}) х (T{ ε }).
В исходной таблице строки пронумеруем элементами (NT{}), столбцы – терминальными символами (и ε).
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) →ДОПУСК