
- •Билет 2 (Проверка открытия exe файла)
- •Клава.Асм
- •Выводит хвост командной строки
- •Породитель процесса (par.Asm)
- •Порождаемый процесс
- •Билет 3 (сканер для лексем)
- •Билет 4 (построить грамматику с возведением в степень)
- •Билет 5 (преобразование для нисходящего разбора)
- •Билет 6 (грамматика для if then else)
- •Билет 7 (представление массива и выведение формулы)
- •Билет 8 (хеш - функция)
- •Билет 9(Построить таблицу идентификаторов)
- •Билет 10 (ка для сканера лексем)
- •Билет 11(грамматика для чисел)
- •Билет 13 (матрица предшествования для грамматики)
- •Билет 14(анализ грамматики для метода предшествования)
- •Билет 16 (Заголовок exe)
- •Билет 17(Структура диска ms-dos)
- •Билет 18 (Синтаксический анализ теория) не написано Билет 19 (Лексический анализ теория)
- •Требования к грамматике нисходящего метода
- •Семантические программы. Перевод инфиксной записи в польскую.
- •Тетрады
- •Хранение грамматики с использованием сети
- •Аппаратные прерывания
- •Представление многомерных массивов в памяти эвм
- •Свободные кластеры логического диска "а" (на всякий)
Билет 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)