Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

shpory_spo 4йкурс

.doc
Скачиваний:
33
Добавлен:
15.06.2014
Размер:
307.2 Кб
Скачать

22 Базовая и индексно базовая адресация.

Основное назначение -предоставлять на уровне архитектуры средства эффективного доступа к полям структур данных.

При выполнении команды с базовым способом адресации аппаратура складывает содержимое баз-го регистра со значением смещения, указанного в команде, получая действительное смещение поля структуры данных. Это значение используется для получения доступа к этому полю: для чтения значения из него или занесения в него новых данных

Описание структуры:

; struct doca

sex DB О

age DD 0

name TIMES 10 DB 0

[базовый _регистр+0] – задает поле sex, [базовый _регистр+1] – задает поле age, [базовый_регистр+5] – name. Изменяя значения базовый_регистр имеем одни и те же поля в различных экземплярах структуры. Вычисление суммы полей age:

mov ebx, persons ; адрес массива структур заносится в ebx

mov ecx, 20

mov еах, 0 ; в ЕCХ сумма

povt: add еах, [ebx+1]

;прибавление значения поля age

add ebx, 15 ; увеличение ebx на размер структуры doca

loop povt

Описание массива:

persons TIMES 20*15 db 0

или

persons

%гер 20

DB 0

DD 0

TIMES 10 DB 0

%endrep

директивы описания структуры данных задаются ключевыми словами STRUC и ENDSTRUC, имя структуры задается как единственный параметр в директиве STRUC. Само описание задается резервированием памяти:

struc doca

sex resb 1

age resd 1

name resb 10

endstruc

в операндах, указывающих доступ к этим полям записывается, соответственно, [ebx+sex], [ebx+age], [ebx+name].

Применяют локальные обозначения, задаваемые в NASM с пом. служебного символа точки в начале имени:

struc doca

.sex resb 1

.age resd 1

.name resb 10

endstruc

имена .sex, .age, .name относятся только к структуре doca. Имена полей должны использоваться вместе с именем структуры в виде имя_структуры.имя_поля

Индексно базовая адресация:

[базовый_регистр + индексный_регистр + смещение]

Используется для обработки массивов данных внутри экземпляров структур.

[ebx+esi+5] увеличением esi переходим к след. элементу в массиве name.

23 Адресация с масштабированием.

в операнде записывается обозначение индексного регистра, а вместе с ним и значение одной из стандартных длин элементов массива. В качестве таких стандартных длин допустимы только 2, 4 или 8.

[имя_области + масштаб * индексный_регистр] или [базовый_регистр + смещение + масштаб * индексный_регистр], где параметр масштаба должен задаваться только числом 2, 4 или 8.

24 Использование общ. данных и процедур в раздельно транслируемых модулях.

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

Такая запись на NASM делается в директиве EXTERN:

EXTERN перечисление_ внешншних_имен

где перечисление_внешнах_имен это перечисление через запятую набора различных внешних имен.

Имена, кот. исп-ся для доступа к данным и подпрограммам из др. исходного модуля сопровождается соответствующей инфой для системы разработки. Эта инфа на NASM задается в директиве GLOBAL, а имена перечисленные в директиве - глобальными. (имена попадают в объектный модуль, сохраняя в нем свое обозначение, а все остальные не сохраняются в объектном модуле, а превращаются в нем лишь в числовые смещения от начала соответствующего сегмента).

Для связывания (компоновки) их в единую выполняемую программу следует использовать вызов компоновщика в виде команды:

ld –о pr.exe pr5.o pr5a.o

В MASM и TASM вместо директивы EXTERN исп-ся директива EXTRN. В ней необходимо для каждого имени указывать его атрибут, которые задаются служебными словами BYTE, WORD, DWORD, NEAR, FAR и должны следовать за именем через разделяющее двоеточие:

EXTRN funa: NEAR

EXTRN sla: DWORD , slb: BYTE, sum: DWORD

Т.о. внутри директивы EXTRN задаются не только внешние имена, но и характеристики размера памяти, связанной с каждым из этих имен.

Вместо директивы GLOBAL имеется директива PUBLIC

SEGMENT .data

EXTERN sla, sib, sum

GLOBAL funа

SEGMENT .code

funa:

push eax

push ebx

mov eax,[sla]

mov ebx, 0

mov bx, [slb]

add eax, ebx

mov [sum], eax

pop ebx

pop eax

ret ; end procedure funa

25 Использование библиотек объектных модулей.

Когда объектных модулей, необходимых для компоновки программы, оказывается много они собираются в спец. наборы объектных модулей, хранимых как отдельные файлы и называеме обычно библиотеками объектных модулей. Применение библиотек требует использования служебных утилит обслуживания – библиотекарей.

Утилита обслуживания библиотек в Unix называется аг:

аг опции модификаторы имя_библиотеки объектные_файлы

где компонент объектные_файлы - перечисление имен файлов, разделяемых пробелами (утилита может применяться для сохранения в виде компактного набора не только объектных файлов, но и др. файлов). Основные опции дан. утилиты:-r задает добавление нового объектного файла(ов) к библиотеке, , -d задает удаление указанных в перечне файлов из библиотеки, , -m задает перемещение указанных в перечне файлов из библиотеки в текущий каталог, а опция -t приказывает выдать на стандартный вывод перечень файлов, содержащихся в библиотеке. Модификаторы записываются непосредственно за опцией. Модификатор, задаваемый буквой 'с' для указания, что библиотеку нужно создать. Стандартное расширение имени библиотек объектных модулей в Unix содержит букву 'а'.

Создание исполняемой программы с применением библиотеки mylib.a:

Командный файл:

./nasmc stwrite

./nasmc stread

./nasmc stexit

ar -re mylib.a stwrite.o stread.o stexit.о

ar -t mylib.a

./nasmc prim5e

ld -o prime.exe prim5e.o mylib.a

Библиотекарь для MS-DOS и OS/2 фирмы Borland имеет название TLIB.EXE. Синтаксис команд:

имя_библиотекаря имя_библиотеки команда объектный файл

для добавления объектного модуля к библиотеке используется символ '+', а для исключения используется символ '-'

tlib mylib.lib -stwrite.obj +stread.obj +stexit.obj

расширением библиотек является буквосочетание lib, a obj исп-ся как расширение объектных файлов (эти расширения могут опускаться)

26 Организация стекового кадра подпрограммы.

Передача больш. числа аргументов с пом. стека - соглашение яз. Паскаль. push значение arg1

push значение arg2

call funa

Участок заполнения стека для проц-ры связ-ют со спец.регистром - указателем (указ-лем фрейма или указ-лем кадра, а в арх-туре Intel - базовым указателем). Обозначение регистра - ЕВР (Base Pointer). Подпроги стандартной структуры должны в кач. первых двух своих командах выполнить:

PUSH ЕВP

MOV EBP, ESP

Рис1.Первая ком. сохраняет предыдущ. знач-ие регистра ЕВР в стеке, чтобы при выходе из проц-ры восстановить исходн. знач-ие, кот. EBP имел в вызывающей проц-ре. Вторая запоминает в ЕВР адрес текущ. верхушки стека - спец. регистр ESP исп-ся как место хранения верш.стека. В ходе вып-ия проги проц-ры содерж-ое регистра ЕВР не меняется. Содерж. четырехбайтового поля стека, где размещено знач. аргумента arg3, м.б. обозначено с пом. баз-го способа адресации в виде [ЕВР+8]. (Старое знач-ие ЕВР - [EBP+0], знач. адр. возврата - [ЕВР+4]) Содерж. поля стека, где храниться знач.аргумента arg2, обозначится [ЕВР+12], а arg1 - [ЕВР+16].

Сумма первых двух аргументов:

MOV eax, [ebp+16] ; arg1

ADD eax, [ebp+12] ;arg2

Аргументы arg1 и arg2 передаются по значению, а аргумент arg3 - по ссылке (по адресу):

PUSH DWORD [arg1]

PUSH DWORD [arg2]

PUSH DWORD arg3

На TASM/MASM:

PUSH arg1

PUSH arg2

PUSH OFFSET arg3

Процедура слож. arg3=arg1+ arg2:

push ebp

mov ebp, esp

push eax

push ebx

mov eax, [ebp+16] ;arg1

add eax, [ebp+12] ; arg2

mov ebx, [ebp+10] ; адрес arg3 mov [ebx], eax ;end add

pop ebx

pop eax

pop ebp

ret ; end procedure

Для храниен. лок. переменных выделяется часть кадра проц-ры: после MOV EBP,ESP вып-ся ком.:

SUB ESP, размер_области_

локальных_переменных.

Рис2.Eсли в подпроге определены две лок.целочислен. переменные i j по 4 байта кажд, то под них необх. зарезервир-ть 8 байтов (в операндах команд поля обознач. [ЕВР-4] и [ЕВР-8]). Перед вых-ом из подпроги необх. обратные действия т.к. поля в верш.стека не позволят автоматич. сделать вершиной стека место хранения адр. возврата. 1)ADD ESP, размер_обл_лок_ переменных в том месте заверш-их действий, где обл. лок. переменных окажется на вершине стека. Либо 2) МOV ESP, EBP.

Удаление из стека полей аргументов:1)вариант яз. Паскаль RET число ,где число (кратн. 2) задает, сколько байтов нужно удалить из стека в ходе вып-ия RET после снятия из стека адр. возврата (в примере RET 12).

Вариант яз. Си 2) ADD ESP, размер_о6л.аргументов_стека

после ком. CALL( в пр.ADD ESP,12). Проблема числа аргументов в подпроге реш-ся с пом. соглаш Си:

push значение arg2

push значение arg1

call funa

В рез-те такой укладки аргументов на верху области аргум-ов в стеке окаж-ся arg1, а последний из списка арг-ов - в низу области внутри стека (arg1 - [EВР+8], arg2 - [ЕВР+12], arg3 - [EBP+16].

29 Программный доступ к системным функциям Win32.

Доступ к системным ф-ям ОС MS Windows организован ч/з спец. библиотеки этой системы, кот. содержат подпроги, вызываемые с пом. машинных команд CALL.

Метод работы со стеками (для аргументов) по соглашению яз. Си STDCALL (аргументы заносятся с конца списка). Освобождение по соглаш. яз Паскаль RET n.

Необходимо использ-ть: EXTERN имена_использ-ых_сист_ф-ии_ windows. Детали к инструментам разработки Call GetStdHandle. Формат: на NASM -f obj имя.asm получается объектный файл, потом исп-ся компановки. Компановщик TLINK32.exe. Описание сегмента данных: GROUP DGROUP DATA

SEGMENT DATA USE32 а для опис-ия сегмента кодов директиву

SEGMENT .text USE32 CLASS = CODE Для двух сегментов данных DATA и BSS получается директива

GROUP DGROUP DATA, BSS

Компоновщик ALINK.EXE определяет сегменты кода и дан. с помощью директив: SEGMENT .text USE32 и SEGMENT .data USE32.

В кач. стандартной метки начала запуска проги для формата OBJ исп-ся имя ..start. (ассемблер принимает по умолч.,что имя глобальное). Прога prog.asm вывода текста в W.:

EXTERN GetStdHandle, WriteFile, ExitProcess

SEGMENT .text USE32 CLASS=CODE ..start: push dword STD_OUTPUT_HANDLE

call GetStdHandle

mov [hstdout],eax

;WriteFile(hstdout, txt, 7, &actlen, NULL)

push dword 0

push dword actlen

push dword 7 ; number of bytes

push dword txt ; address of txt

push dword [hstdout]

; Nhandle=hstdout

call WriteFile

; WriteFile(hstdout, symbl, 1, &actlen, NULL)

push dword 0

push dword actlen

push dword 1 ; numberof bytes

push dword symbl ; address of txt

push dword [hstdout]

; N handle=hstdout

call WriteFile

push dword 0

call ExitProcess

SEGMENT .data USE32

txt db 'Privet!'

symbl db'$'

hstdout dd 0

actlen dd 0

STD_OUTPUT_HANDLE equ -11

Трансляция с использованием компановщика TLINK.EXE:

nasmw -f obj prog.asm

tlink32 prog.obg,,,IMPORT32 prog.exe

Трансляция с использованием компановщика ALINK.EXE:

nasmw -f obj prog.asm -l %1.lst

alink -oPE -subsys console prog C:\util\win32.lib

или использовать командн. файл:

nasmw -f obj %1.asm -l prog.lst

alink -oPE -subsys console %1 C:\util\win32.lib

WLINK:

wlink F% FORMAT

FORM windownt

30 Стандартный доступ к системным функциям Unix (ч/з системные библиотеки).

В OC Unix стандартным средством доступа к системным ф-ям явл-ся вызов их по имени с пом. спец. библиотек. Для ОС Unix стандартный доступ - укладка аргументов на стек и вызов машинной ф-ии CALL, конкретизация же машин. доступа осущ-ся с пом. стандартной библиотеки языка С, кот. оказ-ся необходимой при компоновке. Стандартная библиотека языка С в Linux называется libс. Исп-ся библиотеки со средствами динамич. компоновки. Для ассемблерных прог необходимо либо использ. опцию универсальн. компоновщика ld, либо прогу обработки ориентир-ую прежде всего на язык Си.

1)требует явн. указ-ия в составе опций вызова программы ld опции

-dynamic -linker полное_имя_ динамич_компоновщака

при компоновке необх. указать использ-ие самой библиотеки libc, для чего служит спец. опция вида -lс. Для получения проги:

nasm - f elf $1.asm -l $1.lst

ld -o "$1".exe "$1".o -dynamic-linker/Iib/ld-linux.so.2 -lc

2)использование для компоновки командного вызова вида:

gcc имя_о6ъектного_файла.о

Точка входа в исходном ассемблерном файле д.б. обозначена не именем _start, а именем main. Получение проги:

nasm -f elf $1.asm -l $1.lst

gcc -o "$1".exe "1".o

Проги стандартной библиотеки языка Си в Linux вызыв-ся по стандартным соглашениям (очистка участка стека

CALL имя_ф-ии

ADD ESP, длина_обл_ аргументов

Треб. указывать имена ф-ий библиотеки яз. Си в директивах EXTERN проги на ассемблере).

GLOBAL _start

EXTERN write, exit, printf

SEGMENT .text

_start:

; write(l, txt, lentxt)=<4>(ebx, ecx, edx)

push dword lentxt

push dword txt

push dword 1

call write

add esp, 12

; call printf(formt, x, y)

push dword [y]

push dword [x]

push dword formt

call printf

add esp,12

push dword 1

call exit

SEGMENT .data

txt db 'Privet!', 27, '[10; 40H’, 27, '[1; 31; 44m Ou-key!'

db 27,-'[0m 10

lentxt equ $-txt

x dd 3456

у dd -78881

formt db 'X=%d, Y=%d',10,0

31 Понятие о статической и динамической компоновке.

Компиляция дает объектный файл .obj, а исполняемый формируется. Для компановки ис-ся заготовки, кот. хранятся в библиотеках. Формир-ся исполняемый файл .exe

DLL Dyname Linking Library.

Объектный файл= [служебная инфа и объектный код (машинные коды команд и данных)] Из объектного кода в ехе компоновкой устанавливается действит-ые адреса.

(Для команды в проге идет адрес относит. начала сегмента и ОБкод. Для ф-ий “extern” ОБкод не заполняется, а компановщик находит и формирует действит-ые адреса)

Компоновщик получает: код для .ехе + объектный код из 1-го объектного модуля + из 2-го ОБ модуля +…=>действительное место начала размещения <funa> = (начало размещ. его ОБ модуля + его смещение(из служебной инфы об.модуля))

В многопрограммных ОС от нее стали отказываться. Обычная компоновка многопрогр-ых ОС из ряда объектных файлов формирует обобщенный объектный файл имя.ехе. Загрузчик ОС включает компоновщик динамических связей: Динамическая компоновка времени загрузки Load Time Dynamic Linking и дин. компоновка времени исполнения Run Time Dynamic Linking.

32 Динамическая компоновка времени загрузки в Windows.

Загрузчик-компановщик динамических связей Load Time Dynamic Linking

смотрит с какими подпрогами связь еще не установлена и может заниматься загрузкой. С пом. компановщиков TLINK32 или LINK32 можно строить ехе или dll.

Если строим DLL, то для нее необходима процедура в объектных модулях, которая в NASM начинается со _start: возвращает в EAX не равное нулю и освобождает при выходе 12 байт, если возвращ. значение =0, то DLL не загруж-ся.

Выбор в детализации: 1)спец. опции вызова компановщика 2)спец. файл определения модуля имя.def

Из объектного файла:

Tlink32 -Tpd об.файлы (ч/з пробелы), имя_результата, карта, библиотеки, файл_ определения_модуля(aba.def) получается файл с раширением DLL. DEF файл содержит:

LIBRARY имя dll

EXPORTS имя_подпроги{wiwoda}

прога wpd.asm

extern ExitProcess …

…GLOBAL wiwoda

SEGMENT .text USE32 CLASS=CODE

wiwoda:

push EBP

mov EBP, ESP…

…CALLl GetStdHandle…

…CALL FillConsoleOutputAttribute…

…CALL WriteConsoleOutputCharactorA

popa

pap EBP

ret

инициализации(проверка):

..start: MOV EAX,1 RET12

Трансляция: nasm -f obj wpd.asm

получаем файл: wpd.obj

прога wpd.def

LIBRARY wpdo

EXPORTS wiwoda

Компиляция: Tlink32 -Tpd wpd.obj, wpdo, ,IMPORT32, wpd.def

получаем файл: wpdo.dll

прога для исп-ия wiwoda wexd.asm

extern ExitProcess, sleep, wiwoda

SEGMENT…

..start:

push dword 377

push ttt

CALL wiwoda

add ESP, 8

mov [rer], eax

push DWORD 3000

CALL sleep

push dword 0

CALL ExitProcess

SEGMENT .data

ttt DB ‘……’,0

Трансляция: nasm -f obj wexd.asm

получаем файл: wexd.obj

прога wexd.def

NAME имя {не обязательно}

IMPORTS wiwoda

Компиляция: Tlink32 wexd,,, IMPORT32, wexd.def получаем файл: wexd.exe. Вместо def файла м.б. использована библиотека импорта: IMPLIB.EXE имя.LIB имя.DLL -> получаем библиотеку.

Используем компановщик ALINK.EXE - не использует def файлы, в опциях нет заданных импорта экспорта. Для импорта м.б. использованы библиотеки импорта .LIB. В NASM директивы: EXPORT имя_экспортир-го_файла

В результате в объектный файл попадает спец. запись.

В программе на NASM использ-ие импортируемых ф-ий спец. директивой:

IMPORT имя_объекта библиотека

IMPORT wiwoda wpdo.dll

При этом обращение на ассемблере: CALL [имя_функции]

Компиляция: alink -OPe -dll wpd.obj {библиотека импорта или путь к ней}win32.lib

получаем файл wpd.DLL

- o wpdo.DLL.

В поздних версиях BorlandItrpr. исп-ся компановщик ITLINK32

33 , 36 Динамическая компоновка времени выполнения в Linux и W.

При этом способе прямо в тексте проги указ-ся директивы открытия доступа. 1) Установление доступа к DLL. В W. : HISTANCE Load Library (имя_бибилиотеки)

По возвращаемому значению опред-ся удалось/не удалось установить доступ, елси==0, то не удалось. В U:

# include<dlfcn.h>

void * dlopen - ф-ия возвращает адрес в кач-ве хендла. dlopen (char+ namedll, int mode{это RTDL_LAZY})

Подпроги в DLL инициализир-ся и устанавливается в очередь, когда потребуется, тогда загрузится. Если библ. находится в ОП, то она не загрузится.

Прог в библиотеке м.б. несколько.

2)Получение адреса подпроги (внутри DLL) для виртуального адресного процесса. В W.: FARPROC{д.б. void*} GetProcAddres (HMODULE hdll, char*name function{wiwoda или _wiwoda}) В U.: void* dlsum (void*hdll, char*name_func) Если <void.>==0, то не удалось.

Прекращение связи с DLL:

В W: BOOL FreeLibrary (HIMODULE hdll) B U.: dlclose (void*hdll)

запрос ошибки : dlerror()

прога для си:

void main( {//W

HANDLE hdll…

… hdll=LoadLibrary(“wpd.dll”);

if (!hdll) {… exit();}

afun=(void*) GetProcAddres (hdll, “wiwoda”);

mm=afun (“abc”, 17);…

…FreeLibrary(hdll);…}

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

_ _declspec(dll import или export)

при разработке требуются библиотеки импорта IMPORT32.lib

Реализация ч/з косвенные вызовы:

CALL [afun]…-не имя ф-ии

…в SEGMENT .data…

…afun DD 0…

…push …

CALL GetProcAddress ;рез-т в EAX

mov [afun], EAX

Компиляция в Linux для использ-ия .so: gcc prog.c путь_к_so _кот._хотим_использовать

35 Динамическая компоновка времени загрузки в Linux.

Загрузчик-компановщик динамических связей Load Time Dynamic Linking

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

DLL для Linux это Shared Objects. При написании проги для .so секцию инициализации можно не задавать явно (..start: MOV EAX,1 RET12) объявление :

GLOBAL имя_ф-ии: function

Компиляция:

ld -shared -o mydll.so {имя.o}

можно исп-ть gсс

gсс -shared … mydll.so {имя.o}

Системные библиотеки пишутся: lib собств_имя.главн.млад.вариант

libc.4.3.1

Программные компоненты ссылаются не на полное имя .so, а на обобщенное. Пусть создано mydll.so.1.0 вводится фиктивное имя-ссылка mydll.so, если изменилась версия, то не теребуется сам файл, а исп-ся ссылка.

ln -s mydll.so.1.0 mydll.so.1

ln -s mydll.so.1 mydll.so

при компановке будет исп-ся mydll.so

37 Процедуры инициализации и завершения DLL.

Borland Interpr. для W.

DllEntryPoint (HMODLE hdll, DWORD reason, void* flagload)

0 - если ч/з LoadLibrary, если нет, то DLL_PROCESS_ATTACH;1

DLL_THREAD_ATTACH;2

DLL_PROCESS_DETACH; 0

DLL_THREAD_DETACH; 3

if reason==значение

подключился процесс

_ _DLL Main CRT Startup@12 (COFF)

B Unix: процедура инициализации

_init ;на NASM без аргументов

_fini ;завершение

NASM для Linux

…_wiwoda:…

…ret

_init: _fini

push…

…popa

ret ret

TDUMP.EXE Borland exe или dll в файлы

От MS

DUMPBIN _export имя_файла.dll

DUMPBIN _import имя_файла.dll

Имена в С++ разрастаются и чтоб не уродовались при разработках на gcc -c -f PIC

40, 41 Назначение формальн. грамматик при построении трансляторов.

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

Текст исходной проги -> транслятор -> промежуточная форма (не зависит от аппаратуры, типа процессора)

Для промежуточной формы:

- постфиксная запись (обратная польская)

- абстрактные тетрады действий (абстрактный ассемблер) операция-опер1-опер2-результат

- полумера (ассемблер для типа процессоров)

- обращение к библиотеке процедур интерпретации действия.

36 Понятие формальной грамматики.

Определение формальной грамматики включает в себя:

- -множ-во терминальных символов T;

- -множ. нетермин. символов N;

- -начальн. нетермин. символ Z;

- -множ. порождающих продукций (правила подстановки вместо одной цепочка элементов Т иN)

Терминальные символы :

чисо, id, (), +, *.

В проге : if, (,),<,>,=…

Нетерминальн. символы - синтаксические понятия языка.

expr

N={expr, term, factor}

start=expr

Языки прогр-ия опис-ся с пом. контекстно-свободной грамматики (нетерминал -> цепочка)

Продукции (правила вывода):

выражение - expr

одночлен - term

сомножитель - factor

(1)expr -> expr+term

expr -> expr-term

(2)expr -> term

(3)term -> factor*term

term -> factor/term

(4)term -> factor

(5)factor -> число

(6)factor -> идентификатор

(7)factor -> (expr)

или

expr->expr+term | expr-term | term

term->factor*term | factor/term | factor

factor->число | id | (expr)

Продукции в применении к правильной математ. конструкции описывают ее синтаксическую структуру.

a*(b+c)+d*(5+e) рис1

expr->term+expr->factor*term+ expr->id*term+expr->a*term+expr ->a*factor+expr->a*(expr)+expr-> a*(expr+term)+expr->a*(term+ term)+expr->a*(factor+term)+expr ->a*(id+term)+…->a*(b+term)+… ->a*(b+factor)+…

42. Базовая формальн. грамматика для арифметических выражений.

Продукции (правила вывода):

выражение - expr

одночлен - term

сомножитель - factor

(1)expr -> expr+term

expr -> expr-term

(2)expr -> term

(3)term -> factor*term

term -> factor/term

(4)term -> factor

(5)factor -> число

(6)factor -> идентификатор

(7)factor -> (expr)

или

expr->expr+term | expr-term | term

term->factor*term | factor/term | factor

factor->число | id | (expr)

Продукции в применении к правильной математ. конструкции описывают ее синтаксическую структуру.

a*(b+c)+d*(5+e) рис1

expr->term+expr->factor*term+ expr->id*term+expr->a*term+expr ->a*factor+expr->a*(expr)+expr-> a*(expr+term)+expr->a*(term+ term)+expr->a*(factor+term)+expr ->a*(id+term)+…->a*(b+term)+… ->a*(b+factor)+…

43 Контекстно-свободные грамматики.

КОНТЕКСТНО-СВОБОДНЫЕ грамматики, имеющие в левой части любого правила единственный нетерминал. Такие грамматики являются основой построения синтаксиса любого языка. Сам нетерминал в левой части обозначает не что иное, как синтаксич. конструкцию, причем возможность ее замены на левую часть - описание этой конструкции, возможно в любой цепочке, где этот нетерминал встречается, то есть в любом контексте.

В качестве примера приведем известную грамматику четырех арифметических действий.

выражение - expr

одночлен - term

сомножитель - factor

expr->expr+term | expr-term | term

term->factor*term | factor/term | factor

factor->число | id | (expr)

Понятие атрибутных грамматик.

Атрибутные грамматики содержат для каждого грамматического символа набор атрибутов (вспомогат. хар-ка). К каждой продукции добавляется правило вычисления атрибутов.

45.Синтаксич. управляемая трансляция (с пр. применения для постфиксн. зап. выраж.)

обращение к библиотеке отдельных продукций, интерпретации действий:

(a+b*c)*e

abc*+e*

заполняем стек: встретили знак=> выбираем два значения

*

b*c

+

с

b*c

b

a

a

Атрибутн. грамматика в упрощен. выражениях для перевода обратн. польской записи. @-знак конкатенакции - склеивания

продукция

семантич. правила

expr ->expr1+ term

expr.t=expr1.t@ term.t ‘+’

expr ->term

expr.t=term.t

term ->term1* factor

term.t=term1.t@ factor.t ‘ * ’

term ->factor

term.t=factor.t

factor ->(expr)

factor.t=expr.t

factor ->0

factor= ‘0’

factor ->9

factor= ‘9’

40 Деревья разбора для терминальных цепочек.

4+7*(5+2) Рис1

Соседние файлы в предмете Системное программное обеспечение