shpory_spo 4йкурс
.doc
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* заполняем стек: встретили знак=> выбираем два значения
Атрибутн. грамматика в упрощен. выражениях для перевода обратн. польской записи. @-знак конкатенакции - склеивания
40 Деревья разбора для терминальных цепочек. 4+7*(5+2) Рис1
|
|