Решенные задачи на экзамен Опалевой / variaNTS / VAR_7
.DOCВариант №7
-
Составить А-грамматику, КС-грамматику, распознающую язык {anbm, n>0, m>0}
Автоматная грамматика
T = {a,b}
N= {S, A, B}
R={ S a A, A aA, AbB, BbB, B }
Управляющая таблица детерминированного конечного автомата по автоматной
грамматике G = <T, N, S,R >
|
a |
b |
Eps |
S (q0) |
A |
|
|
A(q1) |
A |
B |
|
B(q2) |
|
B |
|
Функции перехода : q2 – заключительное состояние
(q0 , a) q1
(q1, a) q1
(q1 , b) q2
(q2 , b) q2
Контекстно-свободная грамматика
T = {a,b}
N= {S, A, B}
R={ S AB, A Aa, Aa, BBb, Bb}
-
КС -> НКС . Например: R ={ S–>aA, S–>bB, A–>1A0, A–>ε, B–>1B00, B–>ε }
KC-грамматика называется грамматикой без ε -правил (НKC-грамматикой) , если либо множество R не содержит ε -правил, либо есть единственное правило S -> ε , и S не встречается
в правых частях других правил.
Алгоритм:
-
Построение укорачивающих нетерминалов G : Nε
Нетерминал, порождающий пустую цепочку, называется неукорачиваемым.
Nε = {A,B}
-
Построение R’ . G1=<{a,b,0,1}, {A,B,S},S,{ S–>aA, S–>a, S–>bB, S–>b, A–>1A0, A–>10,
B–>1B00, B–>100 }>
-
AT- грамматику для сравнения арифметических выражений. Допускается использование круглых
скобок ,+,* .Перевести в триады.
Et |
выражение |
t - синтезированный |
E`p,t |
остаток выражения |
p - унаследованный, t - синтезированный |
EARt |
арифметическое выражение |
t - синтезированный |
Tt |
терм |
t - синтезированный |
T`p,t |
остаток терма |
p - унаследованный, t - синтезированный |
Pt |
произведение |
t - синтезированный |
P`p,t |
остаток произведения |
p - унаследованный, t - синтезированный |
Ft |
фактор |
t - синтезированный |
Используем как терминал: |
||
VARt |
переменная |
t – синтезированный |
Et2 EARp1 E`p2,t1
p2p1
t2t1 t1 – тип значения арифметического выражения
E`p1,t2 = EARq1 {равно}p2,q2,r2 E`r2,t1
r1,r2НОВЭЛТ r2 – адрес триады, сгенерированной в соответствии с
таблицей 1
p2p1 p2,q2 – адреса, где находятся значения выражений
q2q1
t2t1
E`p1,t2 < EARq1 {меньше}p2,q2,r2 E`r2,t1
r1,r2НОВЭЛТ
p2p1
q2q1
t2t1
E`p1,t2 > EARq1 {больше}p2,q2,r2 E`r2,t1
r1,r2НОВЭЛТ
p2p1
q2q1
t2t1
E`p1,p2
p2p1
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 = адрес триады, сгенерированной в соответствии с таблицей 1 |
{меньше}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 2 |
{больше}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 3 |
{поменять_знак}A |
Генерируется триада в соответствии с таблицей 4 |
{сложить}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 5 |
{вычесть}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 6 |
{умножить}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 7 |
{делить}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 8 |
Таблица 1:
== |
integer |
real |
complex |
boolean |
integer |
==I A1,A2 |
|
|
|
real |
|
==R A1,A2 |
|
|
complex |
|
|
==C A1,A2 |
|
boolean |
|
|
|
==B A1,A2 |
Таблица 2:
< |
integer |
real |
complex |
boolean |
integer |
<I A1,A2 |
|
|
|
real |
|
<R A1,A2 |
|
|
complex |
|
|
<C A1,A2 |
|
boolean |
|
|
|
<B A1,A2 |
Таблица 3:
> |
integer |
real |
complex |
boolean |
integer |
>I A1,A2 |
|
|
|
real |
|
>R A1,A2 |
|
|
complex |
|
|
>C A1,A2 |
|
boolean |
|
|
|
>B A1,A2 |
Таблица 4:
- (бинарный) |
integer |
real |
complex |
boolean |
integer |
negI A1,A2 |
|
|
|
real |
|
negR A1,A2 |
|
|
complex |
|
|
negC A1,A2 |
|
boolean |
|
|
|
|
Таблица 5:
+ |
integer |
real |
complex |
boolean |
integer |
addI A1,A2 |
|
|
|
real |
|
addR A1,A2 |
|
|
complex |
|
|
addC A1,A2 |
|
boolean |
|
|
|
|
Таблица 6:
- |
integer |
real |
complex |
boolean |
integer |
subI A1,A2 |
|
|
|
real |
|
subR A1,A2 |
|
|
complex |
|
|
subC A1,A2 |
|
boolean |
|
|
|
|
Таблица 7:
* |
integer |
real |
complex |
boolean |
integer |
mulI A1,A2 |
|
|
|
real |
|
mulR A1,A2 |
|
|
complex |
|
|
mulC A1,A2 |
|
boolean |
|
|
|
|
Таблица 8:
/ |
integer |
real |
complex |
boolean |
integer |
divI A1,A2 |
|
|
|
real |
|
divR A1,A2 |
|
|
complex |
|
|
divC A1,A2 |
|
boolean |
|
|
|
|
P.S. Из всех таблиц необходимо убрать строку и столбец: complex
-
Определить, является ли грамматика грамматикой операторного предшествования.
Операторной грамматикой называется приведенная КС-грамматика без -правил, правые части правил которой не содержат смежных нетерминалов.
Строки матрицы предшествования отмечаются символами из T{}, а столбцы – символами из. T{}.
Операторная грамматика G = < T, N, S, R > называется грамматикой операторного предшествования, если между любыми двумя терминалами или символами и выполняется не более одного отношения операторного предшествования.
Отношения предшествования практически строятся также, как и для простого предшествования.
E E or T (1)
E T (2)
T T and P (3)
T P (4)
P i (5)
P ( E ) (6)
P not P (7)
Отношения ищем только между терминальными символами.
-
a b, если A aCb R , где С – либо нетерминал, либо пусто.
Отсюда: ( )
-
a <• b, если A aB R и B + Cb, где С – либо нетерминал, либо пусто.
Т. е. ищем нетерминалы, перед которыми стоят какие-либо Т – символы, и строим все возможные цепочки из этих нетерминалов:
1-ое: E E or T, из Т возможы выводы: T T and P P and P i and P
( E ) and P
not P and P
Получили: or <• and, or <• i, or <• ( , or <• not
3-е: T T and P, из P возможны выводы: P i , P ( E ), P not P
Получили отношения: and <• i, and <• (, and <• not
6-ое: P ( E ), ищем все возможные символы, с которых начинаются цепочки,
выводимые из Е:
E E or T T or T P or T i or T
T and P or T ( E ) or T
not P or T
Отсюда отношения: (<• or, (<• i, (<• ), (<• not , (<• and.
7-ое: P not P, в предыдущем правиле на промежуточном этапе мы уже нашли все
возможные символы, с которых начинаются цепочки, выводимые из P: i, (, not.
Отношения: not<• i, not<• (, not<• not
Из начального символа грамматики выводятся цепочки, начинающиеся с символов:
E E or T T or T P or T i or T
T and P or T ( E ) or T
not P or T
Отсюда отношения: <• and, <• or, <• i, <• ), <• not.
-
a •> b, если A Bb R и B + aC, где С – либо нетерминал, либо пусто.
В исходной грамматике ищем правила, содержащие нетерминал, непосредственно за которым следует какой-либо символ.
1-ое : E E or T , найдем все символы, на которые могут заканчиваться выводы
из Е E or T E or P E or i P not P
E or T and P E or ( E )
Можем занести в матрицу отношения: or•> or, and•> or, i•> or, ) •> or , not •> or
3-е: T T and P , в превыдущем правиле мы нашли символы, на которые
заканчиваются цепочки из T:
Отношения: and•> and, i•> and, ) •> and, not •> and
6-ое: P ( E ), все возможные символы, заканчивающие цепочки из E, найдены:
or •> ), and •> ), i•> ), ) •> ) , not •> )
Так как E является начальным символом грамматики, то также можем добавить следующие отношения: or •> , and •> , i•> , ) •> , not •>
МАТРИЦА ПРЕДШЕСТВОВАНИЯ :
|
or |
and |
i |
not |
( |
) |
Eps |
or |
> |
< |
< |
< |
< |
> |
> |
and |
> |
> |
< |
< |
< |
> |
> |
i |
> |
> |
|
|
|
> |
> |
not |
> |
> |
< |
< |
< |
> |
> |
( |
< |
< |
< |
< |
< |
|
|
) |
> |
> |
|
|
|
> |
> |
|
< |
< |
< |
< |
< |
|
|
Т.к. нет пересечений – грамматика операторного пред-я.
функция "перенос"
|
or |
and |
i |
not |
( |
) |
Eps |
or |
C |
П |
П |
П |
П |
C |
C |
and |
C |
C |
П |
П |
П |
C |
C |
i |
C |
C |
|
|
|
C |
C |
not |
C |
C |
П |
П |
П |
C |
C |
( |
П |
П |
П |
П |
П |
П |
|
) |
C |
C |
|
|
|
C |
C |
|
П |
П |
П |
П |
П |
|
|
E |
П |
П |
П |
П |
П |
|
Д |
Остовная грамматика:
E E or E (1)
E E and E (3)
E i (5)
E ( E ) (6)
E not E (7)
Рассмотрим правило ( 5 ) E i
остовной грамматики G0s. В магазине ниже правой части этого правила i могут быть только те символы b, для которых b <• i, т.е. множество символов { ( , or , and, not , }. Поэтому g ((Ci) = 5, g (orCi) = 5,
g (andCi) = 5, g (Ci) = 5, g (not Ci) = 5, где С {E, }
-
g()
(E or E
1
E or E
1
or E and E
3
(E and E
3
E and E
3
( i
5
or i
5
and i
5
not i
5
i
5
and ( E )
6
not ( E )
6
or ( E )
6
( ( E )
6
( E )
6
and not E
7
or not E
7
not not E
7
not E
7
( not E
7