- •Лабораторные работы по курсу «Системное программное обеспечение»
- •9. Для ll(1) анализатора построить управляющую таблицу m
- •10. Аналитически написать правила вывода для цепочки ll(1) анализатора.
- •11. Реализовать управляющую таблицу m для lr(k) анализатора.
- •12. Построить множество lr(0)-таблиц не содержащих ε-правила.
- •14. Определить функции перехода g(X)
- •15. Определить функцию переноса-свертки f(u)
- •16. Для функции перехода g(X) и функции переноса-свертки f(u) спроектировать управляющую таблицу.
11. Реализовать управляющую таблицу m для lr(k) анализатора.
Дана грамматика G(V, T, P, S):
V = {S, F, L},
T={i, * , :,(,)},
P = {S→(F: L), F→ L*, F→ i, L→F}
LR(k) – анализатор.
Таблица кодирования магазинных символов.
Символ грамматики |
Магазинный символ |
Кодируемая цепочка |
S |
S1 |
┴S |
F |
F1 |
(F |
F3 |
F |
|
L |
L1 |
(F:L |
L2 |
L |
|
i |
i3 |
i |
: |
:1 |
(F: |
* |
*2 |
L* |
( |
(1 |
( |
) |
)1 |
(F:L) |
12. Построить множество lr(0)-таблиц не содержащих ε-правила.
Построим управляющую таблицу LR(0) – анализатора для грамматики, имеющей следующие правила:
S→(F:L)
F→ L*
F→ i
L→F
Расширенная грамматика: если G – грамматика со стартовым символом S, то расширенная грамматика G’ имеет стартовый символ S’ и продукцию S’→S.
CLOSURE(I) – замыкание множества пунктов I. Если в I входит пункт A→α•Bβ, то в замыкании надо взять все пункты вида B→γ. (Всё, что может быть достигнуто левыми порождениями).
GOTO(I,X) – замыкание множества продукций I вида A→α X•β, где A→α•X β входит в I.
Определим множества А0 =CLOSURE({S’→•S}) ={S’→•S, S→•(F:L)}. Включим его в систему в качестве «неотмеченного» множества. Затем должны отметить множество А0 и определить множества GOTO(A0, X).
A1=GOTO(A0, S)=GOTO({S’→•S }, S) = {S’→S• }
A2= GOTO(A0, ( )=GOTO({S→•(F:L)}, ( ) = {S→(•F:L), F→•L*, F→•i, L→•F }
A3=GOTO(A2, F)=GOTO( {S→(•F:L), L→•F}, F)= {S→(F•:L), L→F• }
A4= GOTO(A2, L)=GOTO({F→•L*}, L) = {F→L•*}
A5= GOTO(A2, i)=GOTO({F→•i}, i ) = {F→i•}
A6=GOTO(A3,:)=GOTO( {S→(F•:L)}, :)= {S→(F: •L), L→•F}
A7=GOTO(A4,*)=GOTO( { F→L•*}, *)= {F→L*•}
A8=GOTO(A6, L)=GOTO( {S→(F: •L)}, L)= {S→(F:L•)}
A9=GOTO(A6, F)=GOTO( { L→•F}, F)= {L→F•}
A10=GOTO(A8, ) )=GOTO( {S→(F: L•)}, ) )= {S→(F:L) •}
A0 |
S’→•S S→•(F:L) |
A1 |
S’→•S |
A2 |
S→(•F:L) F→•L* F→•i L→•F |
A3 |
S→(F•:L) L→F• |
A4 |
F→L•* |
A5 |
F→i• |
A6 |
S→(F: •L) L→•F |
A7 |
F→L*• |
A8 |
S→(F:L•) |
A9 |
L→F• |
A10 |
S→(F:L) • |
13. Для LR(k) -грамматики cпроектировать матрицу oblow Вычисление отношения OBLOW для грамматических вхождений грамматики G’ . Матрица отношения OBLOW имеет вид:
Пусть Xi и Zi - грамматические вхождения символов X и Z в правую часть i-ого правила, а Yj – грамматическое вхождение символа Y в правую часть j – ого правила. Определим множество OFIRST(Yi) (входит первым) , в которое включим Yj и все грамматические вхождения, с которых могут начаться цепочки, выводимые из Y:
OFIRST(Yj)=( Yj)
Используя множества OFIRST, определим отношение OBLOW (входит под) следующим образом:
Xi OBLOW Yj – это множество и Yj OFIRST(Zi)}
┴ OBLOW Yj - это множество {(┴ , Yj | Yj OFIRST(S0), где S0 – начальное вхождение.
Отношение OBLOW будем задавать с помощью матрицы, содержащей n столбцов и (n+1) строк.
(0) S’→S0
S→(1 F1 :1 L1 )1
F→ L2 *2
F→ i3
L→F4
|
S’ |
S0 |
(1 |
F1 |
:1 |
L1 |
)1 |
L2 |
*2 |
i3 |
F4 |
S’ |
|
|
|
|
|
|
|
|
|
|
|
S0 |
|
|
|
|
|
|
|
|
|
|
|
(1 |
|
|
|
1 |
|
|
|
1 |
|
1 |
1 |
F1 |
|
|
|
|
1 |
|
|
|
|
|
|
:1 |
|
|
|
|
|
1 |
|
1 |
|
1 |
1 |
L1 |
|
|
|
|
|
|
1 |
|
|
|
|
)1 |
|
|
|
|
|
|
|
|
|
|
|
L2 |
|
|
|
|
|
|
|
|
1 |
|
|
*2 |
|
|
|
|
|
|
|
|
|
|
|
i3 |
|
|
|
|
|
|
|
|
|
|
|
F4 |
|
|
|
|
|
|
|
|
|
|
|
┴ |
1 |
1 |
1 |
|
|
|
|
|
|
|
|