Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО Билеты.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.24 Mб
Скачать

Билет 13 (матрица предшествования для грамматики)

Построить матрицу предшествования для заданной грамматики (общее задание, отличие в заданной грамматике)

Пусть дана грамматика:

E :: = T+E|T

T :: = F*T|F

F :: = id| (E)

Строим множества правых и левых символов для каждого нетерминального символа грамматики

L(F) = {id, ( } R(F) = {id, ) }

L(T) ={F, id, ( } R(T) = {T, F, id, ) }

L(E) ={T, F, id, ( } R(E) = {E, T, F, id, ) }

Используя правила:

Билет 14(анализ грамматики для метода предшествования)

. Может ли в методе простого предшествования использоваться следующая грамматика:

<READ> :: = read(<id_list>)

<id_list> :: = id | <id_list>, id

Требования к грамматике простого предшествования: 1. Между любыми 2-мя терминальными и нетерминальными символами существует не более одного отношения предшествования (билет13). 2. Разные порождающие правила имеют разные правы части.

<F> :: = id … и <id_list> :: = id

Правило 2 для грамматики: 1-е для матрицы предшествования.

Стратификация:

Было: E ::= E+T| T

Стало: E ::= E’

E’ ::= E’+T| T

Исходная грамматика:

<read> ::= read(<id_list>)

<id_list> ::= id| <id_list>, id

<E> ::= <E>+<T>|<T>

<T> ::= <T>*<F>|<F>

<F> ::= id | (<E>)

Устраним неоднозначность для (<E>) и <id_list> ::= id и <F> ::= id

1) <read> ::= read(id)| read(<id_list>)

2) < id_list > ::= < id_list‘ >

3) <id_list’ > ::= id, id| id, < id_list’ >

4) <E> ::= <E’>

5) <E’> ::= <E’> + <T>| <T>

6) <T> ::= <T’>

7) <T’> ::= <T’>* <F>| <F>

8) <F> ::= id| (E)

Устраняем (=id(пр1) и <id_> (пр8))

Устраняем =id и <id (пр3)

1) <read> ::= read(id)| read(<id_list>)

2) < id_list > ::= < id_list1 >

3) <id_list1 > ::= id, id1| id, < id_list >

4) <E> ::= <E1>

5) <E1> ::= <E1> + <T>| <T>

6) <T> ::= <T1>

7) <T’> ::= <T1>* <F>| <F>

8) <F> ::= <id1>| (<E>)

9) <id1> ::= id

Билет 15(a+b*c является ли сентенциальной формой)

Дано предложение a+b*с. Указать является ли оно сентенциальной формой. Установить имеются ли основа , простые фразы, фразы.

Сентенциальная форма-для грамматик G[z],x->cсентенциальная форма, если она выводима из Z или если z=>*x

Предложение языка-сентенциальная форма , состоящая только из терминальных символов.

Фраза-для грамматик G[z] цепочка v является фразой нетерминального символа п для сентенциальной формы w=x v y или существует вывод Эп=>*v

Простая фраза - для грамматик G[z] цепочка v является простой фразой для нетерминального символа п для сентенциальной формы w=x v x или существует вывод п=>v

Основа-основой сентенциальной формы называется самая левая простоя фраза.

1. <E>::=<E’>

2. <E’>::= <E’>+<T> | <T>

3. <T>::=<T’>

4. <T’>::=<T’>*<F> | <F>

5. <F>::=<id> | (<E>)

Предложение является сентенциальной формой , т.к. оно выводимо из E,грамматика G[E]

a+b*c

основа

<F>+b*c

Основа

<T’>+ b*c

Основа

<E’>+ b*c

Основа

<E’>+ <F>*c

<E’>+ <T’>*c <-фраза для <E’> или еще для чего то

Основа

<E’>+ <T’>*<F>

Основа

<E’>+ <T’>

Основа

<E’>+ <T>

Основа

<E’>

Основа

<E>

Билет 16 (Заголовок exe)

В начале любого EXE-файла расположен заголовок, состоящий

из постоянной части и таблицы настройки. Стандартная часть

заголовка имеет следующую структуру.

Смещение Длина Содержимое Комментарий

───────────────────────────────────────────────────────────────

┌────┬────┐

+0 2 │4Dh │5Ah │ Роспись EXE-файла ('MZ')

├────┴────┤

+2 2 │PartPage │ Длина неполной страницы (обычно

├─────────┤ игнорируется)

+4 2 │ PageCnt │ Длина образа в страницах по 512 байт,

├─────────┤ включая заголовок

+6 2 │ ReloCnt │ Количество элементов в таблице

├─────────┤ настройки

+8 2 │ HdrSize │ Размер заголовка в параграфах

├─────────┤

+0Ah 2 │ MinMem │ Мин. память, требующаяся программе,

├─────────┤ в параграфах

+0Ch 2 │ MaxMem │ Макс.память, требующаяся программе,

├─────────┤ в параграфах

+0Eh 2 │ ReloSS │ Начало сегмента стека относительно

├─────────┤ начала образа

+10h 2 │ ExeSP │ Начальное значение SP (указателя

├─────────┤ стека)

+12h 2 │ ChkSum │ Контрольная сумма файла

├─────────┤

+14h 2 │ ExeIP │ Начальное значение IP

├─────────┤ (счетчика команд)

+16h 2 │ ReloCS │ Начало сегмента кодов относительно

├─────────┤ начала образа

+18h 2 │ Tbloff │ Смещение до таблицы настройки

├─────────┤ (обычно 001Ch)

+1Ah 2 │ Overlay │ Номер перекрытия (0 для корневого

└─────────┘ модуля)

+1Ch Размер стандартной части заголовка

Таблица настройки начинается со смещения [Tbloff] и

содержит [ReloCnt] двойных слов вида

┌──────────┬─────────┐

│ смещение │ сегмент │

└──────────┴─────────┘

Таблица настройки дополняется нулями до границы параграфа;

вслед за ней начинается образ программы.

Опишем подробно, как происходит процесс настройки

EXE-программы. Поскольку EXE-файл может быть загружен с любого

параграфа памяти, все абсолютные ссылки на сегменты, такие как

mov ax,seg _TEXT или call far ptr my_prog

должны быть "подправлены" или настроены на фактические адреса

сегментов, в которые загружена программа. Поэтому загрузчик ДОС

(фн 4Bh) выполняет следующие действия.

1. Создание PSP программы вызовом фн 26h.

2. Считывание первых 1Ch байтов EXE-файла (стандартной

части заголовка).

3. Определение размера загрузочного модуля как

(512*PageCnt)-(16*HdrSize)+PartPage

и смещения его от начала файла как

(16*HdrSize)

4. Определение начального сегмента для загрузки программы,

Start_Seg (обычно Start_Seg = PSP+10h) и считывание загрузочного

модуля в память с адреса Start_Seg:0.

5. Позиционирование EXE-файла на начало таблицы настройки.

6. Для каждого элемента таблицы настройки (имеющего вид

I_Seg:I_off):

- вычислить Relo_Seg = Start_Seg + I_Seg;

- слово по адресу Relo_Seg:I_off увеличить на Start_Seg.

7. Выделить программе память за ее пределами согласно

MinMem и MaxMem.

8. Инициализировать регистры и передать управление

программе:

ES = DS = PSP

AX = см. 2.1

SS = Start_Seg + ReloSS ; SP = ExeSp;

CS = Start_Seg + ReloCS ; IP = ExeIP

(push segment; push offset; retf)