Главная » Просмотр файлов » В.А. Серебряков, М.П. Галочкин и др. - Теория и реализация языков программирования (2006)

В.А. Серебряков, М.П. Галочкин и др. - Теория и реализация языков программирования (2006) (1134633), страница 23

Файл №1134633 В.А. Серебряков, М.П. Галочкин и др. - Теория и реализация языков программирования (2006) (В.А. Серебряков, М.П. Галочкин и др. - Теория и реализация языков программирования (2006)) 23 страницаВ.А. Серебряков, М.П. Галочкин и др. - Теория и реализация языков программирования (2006) (1134633) страница 232019-05-12СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 23)

Ïðîâåðêà êîíòåêñòíûõ óñëîâèéÄëÿ ðåàëèçàöèè íåêîòîðûõ àòðèáóòîâ (â ÷àñòíîñòè ñðåäû, ñïèñêà èäåíòèôèêàòîðîâ è ò.ä.) â êà÷åñòâå òèïîâ äàííûõ ìû áóäåì èñïîëüçîâàòü ðàçëè÷íûå ìíîæåñòâà. Ìíîæåñòâî ìîæåò áûòü óïîðÿäî÷åííûì èëè íåóïîðÿäî÷åííûì,êëþ÷åâûì èëè ïðîñòûì. Ýëåìåíòîì êëþ÷åâîãî ìíîæåñòâàìîæåò áûòü çàïèñü, îäíèì èç ïîëåé êîòîðîé ÿâëÿåòñÿ êëþ÷:SETOF T ïðîñòîå íåóïîðÿäî÷åííîå ìíîæåñòâî îáúåêòîâ òèïà T;KEY K SETOF T êëþ÷åâîå íåóïîðÿäî÷åííîå ìíîæåñòâî îáúåêòîâ òèïà T ñ êëþ÷îì òèïà K;LISTOF T ïðîñòîå óïîðÿäî÷åííîå ìíîæåñòâî îáúåêòîâ òèïà T;KEY K LISTOF T êëþ÷åâîå óïîðÿäî÷åííîå ìíîæåñòâî îáúåêòîâ òèïà T ñ êëþ÷îì òèïà K;Íàä îáúåêòàìè òèïà ìíîæåñòâà îïðåäåëåíû ñëåäóþùèåîïåðàöèè:Init(S) ñîçäàòü è ïðîèíèöèàëèçèðîâàòü ïåðåìåííóþ S;Include(V,S) âêëþ÷èòü îáúåêò V â ìíîæåñòâî S;åñëè ìíîæåñòâî óïîðÿäî÷åííîå, òî âêëþ÷åíèå îñóùåñòâëÿåòñÿ â êà÷åñòâå ïîñëåäíåãî ýëåìåíòà;Find(K,S) âûäàòü óêàçàòåëü íà îáúåêò ñ êëþ÷îì Kâî ìíîæåñòâå S è NIL, åñëè îáúåêò ñ òàêèì êëþ÷îì íåíàéäåí.Èìååòñÿ ñïåöèàëüíûé îïåðàòîð öèêëà, ïðîáåãàþùèéýëåìåíòû ìíîæåñòâà:for (V in S) Îïåðàòîð;Ïåðåìåííàÿ V ïðîáåãàåò âñå çíà÷åíèÿ ìíîæåñòâà.

Åñëèìíîæåñòâî óïîðÿäî÷åíî, òî ýëåìåíòû ïðîáåãàþòñÿ â ýòîìïîðÿäêå, åñëè íåò â ïðîèçâîëüíîì ïîðÿäêå.Ñðåäà ïðåäñòàâëÿåò ñîáîé êëþ÷åâîå ìíîæåñòâî ñ êëþ÷îì èìåíåì îáúåêòà. Èäåíòèôèêàòîðû èìåþò òèï TName.Îáîçíà÷åíèå <Íåòåðìèíàë> â ïîçèöèè òèïà ýòî óêàçàòåëü6.2. Çàíåñåíèå â ñðåäó è ïîèñê îáúåêòîâ159(QY(QY(QY(QY(QY(QY(QYÐèñ. 6.2.íà âåðøèíó òèïà Íåòåðìèíàë. Îáîçíà÷åíèå <Íåòåðìèíàë> ââûðàæåíèè ýòî âçÿòèå çíà÷åíèÿ óêàçàòåëÿ íà áëèæàéøóþ âåðøèíó ââåðõ ïî äåðåâó ðàçáîðà, ïîìå÷åííóþ ñîîòâåòñòâóþùèì íåòåðìèíàëîì.Äëÿ ðåàëèçàöèè ñðåäû êàæäûé íåòåðìèíàë Block èìååòàòðèáóò Env. Äëÿ îáåñïå÷åíèÿ âîçìîæíîñòè ïðîñìàòðèâàòüêîìïîíåíòû ñðåäû â ñîîòâåòñòâèè ñ âëîæåííîñòüþ áëîêîâêàæäûé íåòåðìèíàë Block èìååò àòðèáóò Pred óêàçàòåëü íà îõâàòûâàþùèé áëîê. Êðîìå òîãî, ñðåäà áëîêà êîðíÿäåðåâà (íåòåðìèíàë Prog) ñîäåðæèò âñå ïðåäîïðåäåë¼ííûåîïèñàíèÿ (ðèñ.

6.2). Ýòî çàïîëíåíèå ðåàëèçóåòñÿ ïðîöåäóðîé PreDefine. Àòðèáóò Pred áëîêà êîðíåâîé êîìïîíåíòûèìååò çíà÷åíèå NULL.Àòðèáóòíàÿ ðåàëèçàöèÿ âûãëÿäèò ñëåäóþùèì îáðàçîì.// Îïèñàíèå àòðèáóòîâALPHABETProg:: KEY TName SETOF TElement Env.// Êîðíåâàÿ êîìïîíåíòà, ñîäåðæàùàÿ ïðåäîïðåäåë¼ííûå// îïèñàíèÿ.Block:: KEY TName SETOF TElement Env;<Block> Pred.Ident_List:: SETOF TName Ident_Set.// Ident_Set - ñïèñîê èäåíòèôèêàòîðîâ160Ãëàâà 6. Ïðîâåðêà êîíòåêñòíûõ óñëîâèéType_Defin, Type_Use, Access, Expression::TType ElementType.// ElementType - óêàçàòåëü íà îïèñàíèå òèïàDeclaration, Var_Decl, Type_Decl::.Ident:: TName Val.Index:: int Val.// Îïèñàíèå ñèíòàêñè÷åñêèõ è ñåìàíòè÷åñêèõ ïðàâèëRULEProg ::= 'program' Ident Block '.'SEMANTICS0:{Init(Env<3>);PreDefine(Env<3>);Pred<3>=NULL;}.RULEBlock ::= 'begin'[(Declaration)] [(Statement)]'end'SEMANTICS0: if (<Block>!=NULL){Init(Env<0>);Pred<0>=<Block>;}.RULEDeclaration ::= 'type' ( Type_Decl ).RULEType_Decl ::= Ident '=' Type_DefinSEMANTICSTElement V;if (Find(Val<1>,Env<Block>)!=NULL)Error("Identifier declared twice");// Èäåíòèôèêàòîð óæå îáúÿâëåí â áëîêå//  ëþáîì ñëó÷àå çàíîñèòñÿ íîâîå îïèñàíèåV.Name=Val<1>;6.2.

Çàíåñåíèå â ñðåäó è ïîèñê îáúåêòîâV.Object=TypeObject;V.Type=ElementType<3>;Include(V,Env<Block>).RULEType_Defin ::= 'ARRAY' Index 'OF' Type_DefinSEMANTICSElementType<0>=ArrayType(ElementType<4>,Val<2>).RULEType_Defin ::= Type_UseSEMANTICSElementType<0>=ElementType<1>.RULEType_Use ::= IdentSEMANTICSTElement * PV;PV=FindObject(Val<1>,<Block>,TypeObject,<Prog>);If (PV!=NULL)ElementType<0>=PV->Type.//  ýòîì ïðàâèëå àíàëèçèðóåòñÿ èñïîëüçóþùàÿ// ïîçèöèÿ èäåíòèôèêàòîðà òèïà.RULEDeclaration ::= 'var' ( Var_Decl ).RULEVar_Decl ::= Ident_List ':' Type_Use ';'SEMANTICSTElement V;TName N;for (N in Ident_Set<1>){// Öèêë ïî (íåóïîðÿäî÷åííîìó) ñïèñêó// èäåíòèôèêàòîðîâif (Find(N,Env<Block>)!=NULL)Error("Identifier declared twice");// Èäåíòèôèêàòîð óæå îáúÿâëåí â áëîêå//  ëþáîì ñëó÷àå çàíîñèòñÿ íîâîå îïèñàíèå161162}.//////////Ãëàâà 6.

Ïðîâåðêà êîíòåêñòíûõ óñëîâèéV.Name=N;V.Object=VarObject;V.Type=ElementType<3>;Include(V,Env<Block>);N - ðàáî÷àÿ ïåðåìåííàÿ äëÿ ýëåìåíòîâ ñïèñêà.Äëÿ êàæäîãî èäåíòèôèêàòîðà èç ìíîæåñòâàèäåíòèôèêàòîðîâ Ident_Set<1> ñôîðìèðîâàòüîáúåêò-ïåðåìåííóþ â òåêóùåé êîìïîíåíòå ñðåäûñ ñîîòâåòñòâóþùèìè õàðàêòåðèñòèêàìè.RULEIdent_List ::= ( Ident /',' )SEMANTICS0:Init(Ident_Set<0>);1A:Include(Val<1>,Ident_Set<0>).RULEStatement ::= Block ';'.RULEStatement ::= Variable '=' Variable ';'SEMANTICSif (ElementType<1>!=NULL) && (ElementType<3>!=NULL)&& (ElementType<1>!=ElementType<3>)Error("Incompatible Expression Types").RULEVariable ::= Ident AccessSEMANTICSTElement * PV;PV=FindObject(Val<1>,<Block>,VarObject,<Prog>);if (PV==NULL){Error("Identifier used is not declared");ElementType<2>=NULL ;}elseElementType<2>=PV->Type.RULE6.2.

Çàíåñåíèå â ñðåäó è ïîèñê îáúåêòîâ163Access ::= '[' Expression ']' AccessSEMANTICSElementType<4>=ArrayElementType(ElementType<0>,ElementType<2>).RULEAccess ::=SEMANTICSElementType<Variable>=ElementType<0>.Ïîèñê â ñðåäå îñóùåñòâëÿåòñÿ ñëåäóþùåé ôóíêöèåé:TElement * FindObject(TName Ident, <Block>BlockPointer, TObject Object, <Prog> Prog){ TElement * ElementPointer;// Ïîëó÷èòü óêàçàòåëü íà áëèæàéøèé// îõâàòûâàþùèé áëîêdo{ElementPointer=Find(Ident, BlockPointer->Env);BlockPointer=BlockPointer->Pred;}while (ElementPointer==NULL)&&(BlockPointer!=NULL);// Èñêàòü äî ìîìåíòà, êîãäà ëèáî íàéä¼ì íóæíûé// èäåíòèôèêàòîð, ëèáî äîéä¼ì äî êîðíåâîé// êîìïîíåíòûif (ElementPointer==NULL)&&(BlockPointer==NULL)// Äîøëè äî êîðíåâîé êîìïîíåíòû è åù¼ íå íàøëè// èäåíòèôèêàòîðà// Íàéòè îáúåêò ñðåäè ïðåäîïðåäåë¼ííûõElementPointer=Find(Ident, Prog->Env);if (ElementPointer!=NULL)// Íàøëè îáúåêò ñ äàííûì èäåíòèôèêàòîðîì ëèáî// â î÷åðåäíîì áëîêå, ëèáî ñðåäè ïðåäîïðåäåë¼ííûõif (ElementPointer->Object!=Object){// Ïðîâåðèòü, èìååò ëè íàéäåííûé îáúåêò// íóæíóþ êàòåãîðèþError("Object of specified categoryis not found");ElementPointer=NULL;164Ãëàâà 6.

Ïðîâåðêà êîíòåêñòíûõ óñëîâèé}else// Îáúåêò íå íàéäåíError("Object is not found");return ElementPointer;}Ïåðåìåííàÿ BlockPointer óêàçàòåëü íà áëèæàéøèéîõâàòûâàþùèé áëîê. Ïåðåõîäÿ îò áëîêà ê áëîêó, èùåì îáúåêò â åãî ñðåäå. Åñëè íå íàøëè, òî ïåðåõîäèì ê îõâàòûâàþùåìó áëîêó. Åñëè äîøëè äî êîðíåâîé êîìïîíåíòû, ïûòàåìñÿ íàéòè îáúåêò ñðåäè ïðåäîïðåäåë¼ííûõ îáúåêòîâ. Åñëèîáúåêò íàøëè, íàäî óáåäèòüñÿ, ÷òî îí èìååò íóæíóþ êàòåãîðèþ.Ôóíêöèÿ ArrayElementType(TType EntryType, TTypeExprType) îñóùåñòâëÿåò ïðîâåðêó äîïóñòèìîñòè ïðèìåíåíèÿ îïåðàöèè âçÿòèÿ èíäåêñà ê ïåðåìåííîé è âîçâðàùàåòòèï ýëåìåíòà ìàññèâà.Ôóíêöèÿ ArrayType(TType EntryType, int Val) âîçâðàùàåò îïèñàíèå òèïà ìàññèâà ñ òèïîì ýëåìåíòàEntryType è äèàïàçîíîì èíäåêñà Val.Ãëàâà 7.Îðãàíèçàöèÿ òàáëèöñèìâîëîâ ïðîöåññå ðàáîòû êîìïèëÿòîð õðàíèò èíôîðìàöèþ îáîáúåêòàõ ïðîãðàììû â ñïåöèàëüíûõ òàáëèöàõ ñèìâîëîâ.Êàê ïðàâèëî, èíôîðìàöèÿ î êàæäîì îáúåêòå ñîñòîèò èçäâóõ îñíîâíûõ ýëåìåíòîâ: èìåíè îáúåêòà è îïèñàíèÿ îáúåêòà.

Èíôîðìàöèÿ îá îáúåêòàõ ïðîãðàììû äîëæíà áûòüîðãàíèçîâàíà òàêèì îáðàçîì, ÷òîáû ïîèñê å¼ áûë ïî âîçìîæíîñòè áûñòðåå, à òðåáóåìàÿ ïàìÿòü ïî âîçìîæíîñòèìåíüøå.Êðîìå òîãî, ñî ñòîðîíû ÿçûêà ïðîãðàììèðîâàíèÿ ìîãóòáûòü äîïîëíèòåëüíûå òðåáîâàíèÿ ê îðãàíèçàöèè èíôîðìàöèè. Èìåíà ìîãóò èìåòü îïðåäåë¼ííóþ îáëàñòü âèäèìîñòè.Íàïðèìåð, ïîëå çàïèñè äîëæíî áûòü óíèêàëüíî â ïðåäåëàõñòðóêòóðû (èëè óðîâíÿ ñòðóêòóðû), íî ìîæåò ñîâïàäàòü ñèìåíåì îáúåêòà âíå çàïèñè (èëè äðóãîãî óðîâíÿ çàïèñè). òî æå âðåìÿ èìÿ ïîëÿ ìîæåò îòêðûâàòüñÿ îïåðàòîðîìïðèñîåäèíåíèÿ, è òîãäà ìîæåò âîçíèêíóòü êîíôëèêò èì¼í(èëè íåîäíîçíà÷íîñòü â òðàêòîâêå èìåíè).

Åñëè ÿçûê èìååòáëî÷íóþ ñòðóêòóðó, òî íåîáõîäèìî îáåñïå÷èòü òàêîé ñïîñîá õðàíåíèÿ èíôîðìàöèè, ÷òîáû, âî-ïåðâûõ, ïîääåðæèâàòü áëî÷íûé ìåõàíèçì âèäèìîñòè, à âî-âòîðûõ ýôôåê165166Ãëàâà 7. Îðãàíèçàöèÿ òàáëèö ñèìâîëîâòèâíî îñâîáîæäàòü ïàìÿòü ïðè âûõîäå èç áëîêà.  íåêîòîðûõ ÿçûêàõ (íàïðèìåð, Àäå) îäíîâðåìåííî (â îäíîì áëîêå)ìîãóò áûòü âèäèìû íåñêîëüêî îáúåêòîâ ñ îäíèì èìåíåì, âäðóãèõ òàêàÿ ñèòóàöèÿ íåäîïóñòèìà.Ìû ðàññìîòðèì íåêîòîðûå îñíîâíûå ñïîñîáû îðãàíèçàöèè òàáëèö ñèìâîëîâ â êîìïèëÿòîðå: òàáëèöû èäåíòèôèêàòîðîâ, òàáëèöû ðàññòàíîâêè, äâîè÷íûå äåðåâüÿ è ðåàëèçàöèþ áëî÷íîé ñòðóêòóðû.7.1.

Òàáëèöû èäåíòèôèêàòîðîâÊàê óæå áûëî ñêàçàíî, èíôîðìàöèþ îá îáúåêòå îáû÷íîìîæíî ðàçäåëèòü íà äâå ÷àñòè: èìÿ (èäåíòèôèêàòîð) è îïèñàíèå. Åñëè äëèíà èäåíòèôèêàòîðà îãðàíè÷åíà (èëè èìÿèäåíòèôèöèðóåòñÿ ïî îãðàíè÷åííîìó ÷èñëó ïåðâûõ ñèìâîëîâ èäåíòèôèêàòîðà), òî òàáëèöà ñèìâîëîâ ìîæåò áûòü îðãàíèçîâàíà â âèäå ïðîñòîãî ìàññèâà ñòðîê ôèêñèðîâàííîéäëèíû, êàê ýòî èçîáðàæåíî íà ðèñ. 7.1. Íåêîòîðûå âõîäûìîãóò áûòü çàíÿòû, íåêîòîðûå ñâîáîäíû.ßñíî, ÷òî, âî-ïåðâûõ, ðàçìåð ìàññèâà äîëæåí áûòü íåìåíüøå ÷èñëà èäåíòèôèêàòîðîâ, êîòîðûå ìîãóò ðåàëüíîïîÿâèòüñÿ â ïðîãðàììå (â ïðîòèâíîì ñëó÷àå âîçíèêàåò ïåðåïîëíåíèå òàáëèöû); âî-âòîðûõ, êàê ïðàâèëî, ïîòåíöèàëüíîå ÷èñëî ðàçëè÷íûõ èäåíòèôèêàòîðîâ ñóùåñòâåííî áîëüøå ðàçìåðà òàáëèöû.Çàìåòèì, ÷òî â áîëüøèíñòâå ÿçûêîâ ïðîãðàììèðîâàíèÿñèìâîëüíîå ïðåäñòàâëåíèå èäåíòèôèêàòîðà ìîæåò èìåòüïðîèçâîëüíóþ äëèíó.

Характеристики

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6418
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее