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

Вариант №2

    1. Составить А-грамматику(автоматную) для языка, состоящего из 1 и 0, причем

каждая единица заключена между нулями.

T = {0,1}

N={S, E}

R={ S , S0A, A0B, A1S, A , B 0A, B1A, B   }

Управляющая таблица детерминированного конечного автомата по автоматной

грамматике G = <T, N, S,R >

0

1

Eps

S (q0)

A

A (q1)

B

S

B (q2)

A

A

Функции перехода:

 (q0 , 0)  q1

 (q1 , 0)  q2

 (q1 , 1)  q0

 (q2 , 0)  q1

 (q2 , 1)  q1

Входному языку принадлежат цепочки, состоящие из комбинации любого кол-ва нулей и 0 1 0 (т.е. каждая единица заключена между нулями).

1.2.Удалить бесполезные символы грамматика G=<T,N,S,R>

T={a,b,c,d} N={S,A,B,C} R={S->aC, S->bA, A->cAB, B->aC, C->bA, C->d.}

Бесполезным  называется символ грамматики, который является непроизводящим или недостижимым. Для удаления бесполезных символов необходимо сначала удалить непроизводящие, а затем недостижимые символы.

Нетерминал, который не порождает ни одной терминальной цепочки, называется  непроизводящим. 

Символ называется  недостижимым , если он не встречается ни в одной из сентенциальных форм (т.е. ни в одной из терминальных цепочек, порождаемых грамматикой).

Алгоритм исключения бесполезных символов.

  • Построение множества порождающих нетерминалов G : Np (т.е.нетерминалов, из которых с помощью любого количества правил можно перейти к терминалам)

N0p ={C} N1p ={C, B, S} Np={C,B,S}

  • Удаление лишних правил. Строим G1 = <T, Np,S,R1>, S  Np

В R1 входят правила, содержащие символы, принадлежащие Т и Np

R1 = { S->aC, B->aC, C->d. }

  • Построение множества достижимых символов гр-ки G1 : Vr (т.е. символов, которые можно вывести из начального символа грамматики)

V0r = {S} V1r = {S, a, C} V2r = {S, a, C, d}

G1=< {a,d}, {S,C}, S, { S->aC, C->d }>

  1. Построить МПА, распознающий логические выражения состоящие из идентификаторов, круглых

скобок и логических операций И ИЛИ НЕ

EE or T, ET, TT and P, TP, Pi, P not P, P (E)

(q, , E) = {(q, E or T), (q, T) }

(q, , T) = {(q, T and P), (q, P)}

(q, , P) = {(q, not P), (q, (E)), (q, i)}

(q, a, a) = {(q, )} для всех a{i, and, not, or, ( , )}

Пример: i and i or i

(q, i or i and i, E) (q, i or i and i, E or T) (q, i or i and i, T or T) (q, i or i and i, P or T) 

(q, i or i and i, i or T) (q, or i and i, or T) (q, i and i, T) (q, i and i, T and P) (q, i and i, P and P) (q, i and i, i and P) (q, and i, and P) (q, i, P) (q, i, i) (q, , )

  1. Построить атрибутно-транслирующую грамматику для семантики раздела переменных в языке Pascal

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

VARt

переменная

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

VOt

переменная старого типа

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

VO`t,p

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

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

IPt

имя поля

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

It

индекс

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

I`t,p

остаток индекса

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

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

EARt

арифметическая переменная

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

ITt

имя типа

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

VARq3  ( ITp1 ) VOq1 {преобразовать_тип}p2,q2

p2p1 p1 – старый тип, q1 – новый тип

q2,q3q1 Преобразование типов производится в случаях, если это возможно

VARp2  VOp1

p2p1 p1 – значение типа

VOt2  idp1 VO`p2,t1

p2p1 p1 – имя идентификатора (обозначение имени поля)

t2t1 t1 – значение типа

VO`p1,t4  [ Iq1 {ЭМ}p2,q2,r1 I`r2,t1 ] VO`t2,t3

r1,r2НОВЭЛТ

p2p1 p2 – элемент массива

q2q1 q2 – индекс массива

t2t1 t2 – имя идентификатора (имя поля)

t4t3 t3 – значение типа элементов массива

VO`p1,t2  . IPq1 {ПЗ}p2,q2,r1 VO`r2,t1

r1,r2НОВЭЛТ

p2p1 p2 – имя записи

q2q1 q2 – имя поля записи

t2t1 t1 – значение типа

VO`p1,p2  

p2p1

Ip2  EARp1

p2p1 EAR – арифметическое выражение, кот. д/соответствовать

типу, приводимому к integer

I`p1,t2  , Iq1 {ЭМ}p2,q2,r1 I`r2,t1

r1,r2НОВЭЛТ

p2p1

q2q1

t2t1

I`p1,p2  

p2p1

IPp2  idp1

p2p1 p1 – имя идентификатора (обозначение имени поля)

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

{преобразовать_тип}A1,А2

Генерируется триада Ntype A1,A2

{ЭМ}А1,А2,R

R = номер триады EM A1,A2

{ПЗ}А1,А2,R

R = номер триады PZ A1,A2

Ntype A1, A2

Преобразовать тип значения по адресу A2 в тип А1

(см. соответствующую таблицу, стр. 7).

EM A1, A2

Элемент массива A1 с индексом A2.

PZ A1, A2

Поле A2 записи A1.

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

P.S. Переведено в триады, LL(1) анализ

4. Построить матрицу (простого?) операторного предшествования:

R={E->E+T, E->T, T->T*P, T->P, P->.C., C->/C, C->/ } T={+,*,.,/ }

EE+T (1)

ET (2)

TT*P (3)

TP (4)

P.C. (5)

C/C (6)

C/ (7)

Отношения ищем только между терминальными символами.

  • a b, если A aCb R , где С – либо нетерминал, либо пусто.

Отсюда: . .

  • a <• b, если A aB R и B + Cb, где С – либо нетерминал, либо пусто.

Т. е. ищем нетерминалы, перед которыми стоят какие-либо Т – символы, и строим все возможные цепочки из этих нетерминалов:

(1) EE + T из Т возможы выводы: T  T * P  P * P  . C . and P

Получили: + < *, + <.

(3) TT * P Отсюда: * <.

(6)C/C Отсюда: / <• /

(5) P.C. Отсюда: . <• /

Из начального символа грамматики выводятся цепочки, начинающиеся с символов: + * .

Отсюда отношения: <• +, <• *,  <.

  • a > b, если A Bb R и B + aC, где С – либо нетерминал, либо пусто.

В исходной грамматике ищем правила, содержащие нетерминал, непосредственно за которым следует какой-либо символ.

(1) E  E + T , найдем все символы, на которые могут заканчиваться выводы

из Е  E + T  E + T * P  E + T * . C .

Можем занести в матрицу отношения: +> +, *> +, . > +

(3) TT * P Отсюда: *> *, . > *

(5) P.C. Отсюда: /> .

Из начального символа грамматики выводятся цепочки, заканщив.: + * .

+ •> , * •> , . •> 

МАТРИЦА ПРЕДШЕСТВОВАНИЯ :

+

*

/

.

Eps

+

>

<

<

>

*

>

>

<

>

/

<

>

.

>

>

<

=

>

<

<

<

Построение функций “ перенос-свертка” см. в. Вариант №7 (4)

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