Virt N. Algoritmy struktury dannyh = programmy (ru)(T)(410s) (522393), страница 61
Текст из файла (страница 61)
Никакая входная последовательность не должна приводить к катастрофе. 2. Все конструкции, которые по определенио языка являются нсзаконпымн, должны обнаруживаться н отмечаться. Все жс ясно, что никакая схема, которая достаточно эффективно транслирует правильные предложения, не сможет так жс эффективно справляться со всеми возможными неправильными конструкциями. Да н как может быть иначе! ргадкага РЕО (1Л)ги1,аи1риг); «трипс ьтиор с П" 7/О с восглиаиовлением лри синпыкси 7есниге ошийнаК» !абе! 99; сола! иоггг = 11; «количество зарезервированных слов1 гхлгак == 100; «длина гпайлт1ы имен» плигх == 14; «макчиюмальпое количесгиво г1ггд5р в чисиск» а1 =- 10; «длина гинеи) куре зугг~бо1 ---. [пи7, Успб пиглбег, р1из, гп1гисб гбпеи з«ггз1н ог1 1зггп, ед7, пса, 1зз, 7с1аб екг, дед, 11гагсп, г1пггсл, солила, зсглй о7ол, рег1ог7, Ьесотез, Ьсетзыл, ст1зггл„Цгыл, 71плюл, п1и1езуип с1озунб саИзгип, салзгзан, тагзупб ргосз пи); а79 —.— рас«сей аггау [1 ., а1» о1 сбак; обгеск = «солз!гглгр гаг1аб«ср ргосег1игс)1 зугггзек =- ее! ой зггибо1; как сб: сбаг; «последний прочитанный вкодной поивол» зугп: зугпбо1; «лоследигй прочигггаппьн7 символ тыка) 1с7: ауп; «последнее ирочггтаниое апн) пит: 1лгеесг, «последнее прочитанное ч<ссло) сс; тгсеег; «счелгчик символов) 71' угг!енсу; «дгии!а счгузогаг) 7с7с: игееег; 7те: аггау [1,, 81) оЕ с1нгг,' а: а[«а; и огг7: аггау [1, .
иогп) ок а«7а; изулы аггау [1, . поги) оГзгтЬо!; ззулп аггау [сбаг» о! зутбо«: с«ес1беузуз, згагбсезуз, уасбеууз: з1 тзе11 Каб«е: аггау [О .. ггопан) оГ гесокг« ггагле. 'а!а; б1лс7: обгеск епй; ргосейпге еггаг (гы Ь!ерсг); Ъеа«п книге«л[' '.сс, ",', и 2); епв [еи ог»; ргоседпге гсз1 (з1Л2; з1чйзег; и: 1нксеа); Ъей!и «7' —,[зут !и з1) гбеп Ьер!и еиог[л); з1:==. з1 -~- з „' пЪ!«е — (з1ки «п з 1) йо лекз.ии еп4 епг« [гезг»; ргосейиге Ыос1с (!х: Ьисесг; 1зусп хупгге!)," ргоссйиге сп!сг (Ь: од)ес!); Ьерп [запись обьекша в гпабпицу) !х:=- !х -;- 1; МГЬ !аБ!е(!и) йо ЬеЯ!и пап!в 1= 7с!' !с!па:= 41 еп4 епй (еп!ег); Хипсйопуоз1!юп (иг; а~а): Ь!!еКег; таг 1: Ы!ерт; Ъе41п (поиск имени Ы в гпаблице) !аЫе10) лате:=.
Ы; ! '.=- !х; п441е !аЫеД лате ~ 14 4о !':= г-'11 поз!!1оп:=- 1 епй (рой!!1оп); ргосейиге сопМес1ага!1оп; Ъерп Изуп! =- Иепг 1Ьеп Ъе41п ке!зупг; 11зут 1п (еф Ьесояез) !Ьеп Ье41п 11 зут = Ьесопгез 1Ъеп еггог (1); «е!зуго; И'ау!и = — питде 1Ъеп Ъерп еп!ег (сепг!ап!)! беят епй е1ае е!тог (2) спй е1ае итог (3) епй е1эе с!тот (4) епй (сопз!4ес1ага!1оп) 1 ргосейиге гагс1ес1ага!юп! Ъе41п!1зут = Иеп! ГЬеп Ьерп еп!ег (га! 1аЫе)! йейупг епй е1ае еггог (4) епй (гт4ес!ага!1оп) ! ргосейиге з!и!степ! ЯИ: зу!пге!); таг 1: !пгесег; ргосейигс еаргегз1оп (1зути зупгге!)! ргосейиге !епп (Йуз: зугпяе!); ргосейиге )ас!ог (!за".
зутге!); гаг !'; Ьиецег: Ье4$п гез! (гасдедкуя, ~яуз, 24)1 ъЫ1е аут 1п,~асЬейзуз 4о Ьеп1п 11згююю = 1с(с!юг 11геп Ьеп(п 1;= роз(гюоюю (н1); 11 ю' == О 1Ьеп еггог (11) е1зе 11 гагю1с Я Ллю( .= ргосИиге 1Ьеп сггог (21); дс!зуюн епй е)зе 11зут ==- гюитбег 1Ьеп Ьеи)п дегзуююю; епй е1зе ъЕ зут !рагсл 1Ьен Ьеп(п негзулг! схргезз!он ([граю'еюг)+)зй з); 11'зуююг = грагсл 1Ьеп це!зуюл е1зе сютог (22) епй; гсзг (!зуз, [1рагеюю), 23) епй епй [ 1асгог); Ъеййп [юсгт) )асгог (узуз-Н [ггюггез, з(аз1ю)); вЬ11е зупг 1п [юютс.ю, згазй) йо ЪЕП(П 11С1Зуггг! уСЮС! ОЮ'(5ЗуЗ+[11гггЕЗю З[аЗ)Ю1) епй епй [гсгюн);- Ъей)п [схргезз1ол) 11 зут [п [р1из,ююю(югиз) 1Ьеп Ъееап есгзг т; гегт(Я з+[р1из, т1югиз)) епй е!ье !егню(„6уз+[р1ююз, юн1нююз))", аЬ11е зут юп [р!из, нгглиз) йо ьеп1п негзут; гегню(гзуз-'г[р1из, ттиз)) епй епй [схрю'еззгол); ртоеейпге солс1111огю(1Зуз: зутзсг); Ъей(п И'зут = ойбглю 1Ьеп Ъеп(п еегзуююю; схргезз(ол(Я з); епй е)зе Ъеп1п ехрюспз(оюг ([ео1, ггеа, 1зз, 1, гг, 1са, пса)+!зуз)1 !à — (зг.л юп [сф лсю1, 1зп 1ссю, «гг, еса)) 1Ьеп сггог (20) е1зе ьеьйп регзут; ехргезз(оюю (узуз) епй епй епй [союгс1111ол); Ъеп1п (л«а«степ!) Илу«п =- !«!еп! Йеп Ъед1п «: — ролг«!оп(!«!) ! И ! == О йеп е«тог (1 1) еЬе И «аЫеД .ЬЫ«! ~ таг!аЫе йеп еггог (12); «е«лут; И лу«п = бе«отел йеп ге«лу«п еЬе еггог (13); ехргслл«оп®ул); епй еЬе Илут = са!!луп! йеп Ъерп ее«лут; И лув Ф !«Ееп! йеп еггог'(14) еЬе Ьерп 1: = ролг«!оп(!«!) ! И ! = О йеп еггог (11) еЬе ЕЕ «аЫе(Е1,у«Еп«! Ф ргосе«1пге 1Ьеп егтог (15); Ее«луч епй аида е1ае Клут = фуп! Йеп Ъерп ее«луп«; соп«Е!«!о«! ((«у«еплув, «Еолут«-«.„Елул); Н'лут =- «Ьеплут йеп гефт еЬе атог (1б); л«а«е«пеп«(улул) епй е1ае $Елут = Ье8Еплув йеп Ъе81п 8е«л»т; л«а«етеп«((лет!са!о!,„еп«Елут1+Елул); яЬ~1е лут 1и (лет!со!оп)+л«а«Ье8лул йе Ъе8ш Илут = лет!со!оп йеп «е«лут еЬе еггог (10),.' л«а«етеп«((лет!со!оп,епйуп«1+!лул) еаза; И луп« = е«««!лув йеп 8е«лу«п еЬе еггог (17) ееЕ еЬе И лут = 'и уц!елут йеп Ъерп «е«лут; соп«Е!«!оп((фолут)+Елул); И лут = «!олут йеп Ее«лут еЬе «ггог (18)1 л«а«ете«««(«лу'л); еаза; «ел«(1лул, ( ), 191 епй («аа«степ«1 1 Ье81п (Ыос!«) хереа1 И лу«п:= сопл«лут Йеп Ъеп!и ес!з)пп; гарса! гопз!г)гс1игиноп1 н1н!е зтт - гоиппи до Ьерп ее!зги~; гопз!Йсс1иггзпрп епй; !1' зтпз =- зги!со!оп съев 5с!з)ип е)не сггог (5) пп!!! з)т Ф !г1слг епй 1 !!'з)нп = тигзуш ЬЪеп Ъеа(н дсгз)ип; терна! тигг1сг1гпи!!оп; ннЪ11е з)нц == сопппа де Ъерп дс!з)п~; тгс1ес!агиг!он епй; 11' зуп! = =* не!в!со!он 1Ъеп «е!зупт е1не еггог (5) па!11 з)ип 'г': и!сп1; й; в)й(е зуев == ргогз)ип до Ъеа(п есзз гоп; Ызуи =- Уеп11Ъеп Ьерп сп!сг (рви гз1нгс)1 ее!зупз епй е!не еггог (4); 11 за = зспдсо!оп !Ъеп ее!зузп е1не гогот (5); Ь)ог)г (пт, (зепнго!оп)+Я'ь)1 11зрп =- зсппсо)оп 1Ъеп Ьеа)п5егз)в!; !ез!(згагЬсйзУзм (Ыен1,РгосзУт~,)зУз, 6) епй е1не еггог (5) й; !гз! (з!игЬснз) з+ (й)епг'1 г)сс1Ьеезуз, 7) пв1!! —,(зпи Ьп йс!Ьеязуз) ! зги!втсп!((зсги!го!оп, гпг)зуп~~-'г~зуз); !сзг()зуз, ( ), 5); епй (Ь)ог)г); Ъерп (осповноп прогрингпи ) ...
Инициация(см. программу 5,и)... сс:=. О; П;== О; сд: —. ' ', И: и==: и1; дгззузн; Ь)ог)с (О, (!зсг!оЯ -;-з!сг)Ьгдзуз , 'згигЬгйззн); !! зупз те 1зсг!оз1 1!реп смог (9); 99: зтг!!г)а епй . Прогоамма о.5. Грамматн ксана разбор дон ИУ!10 с аосстнноалсннам нрн ошнонах. дай лро<ыееог! П<«О 3. Ошибки, встречающиеся довольно часто и лей<стви<ельно являющиеся ошибками программиста (вызванными недосмотром или недопониманием), должны правильно диагно. стпроваться и пе вызывать ! яких-либо дальнейших отклонений в работе травел!пора — сообц<сний о так называемых наее<)<о<ных ошибках.
Предлагаемая схема восстаповлеши работает у;<ов.<створптельио, х<пя, кяк всегда, возможно ее ляльнсйш<с усовершенствование. Ве преиму<цесгво и <ом, э!о она построена системзтп<шским образо.'! Ио нссколы<пи основпым правитзм. Эти осиовпые правила просто разработаны с помощью выбора параметров, осиовзиноео иа эврис<пчсскнх соображениях и опь<те практического использова<пи я<зыка. ЕЛЕ. ПРОЦЕССОР ПЛ/Е В самом дслс, примечательно, что до снх пор транслятор ПЛ/О разрабатывался в полном неведении, лля какой машины он должен формировать рзбочую программу.
Да и с какой стати ст()скз ура ма<нины должна Влиять на схему синтаксического анализа н восстаповлепня при ошибках? Более того, она действитетьио не долл<На влиять. Вместо этого собственно схема формирования кола для любой вычислительной машппы должна накладываты я на алгоритм грамматического разоора методом поэтапного уточнения существующей программы. Поскольку теперь мы готовы к этому, нужно выбрать процессор, для которого производится трансляция.
Чтобы описание транслятора ос<звалось лостяточио про. етым и свободным от посторонних соображений, сзязаиных с конкретными особенностями какого-либо реальпого процессора, мы прилусмаем сво<о собственную вычислительную машину, специально приспособлсипу<о лля ПЛ/О. Это некий гипотетический процессор, который не существует иа самом деле (в аппаратном виде); мы назовем его машиной ПЛ/О. В этом разделе мы ие будем подробно обьясцять, почему мы выбрали именно такт<о машипную архитектуру.
Вместо этого данный раздел буде~ служить руководством по процессору, состоящим из вводного интуитивного описания, за которым будет следовать подробное определение процессора с помощью алжзрптма. Эта формализяппя может служить примером аккуратного и подробного описания для реальных процессоров. Наш алгоритм последовательно интерпретирует команды ПЛ/О и пазывзезся нягерпрегатором В машину ПЛ,'О входя~ две области памяти„регистр команды и трп рсгпс<рз адресов.
Оае<лто для лроерамлы, Называемой рабочей програл<л<ой, зшружается трзисляторо.н 5. Сг>>у«гуро языков и гронгвягорв> н во время интерпретации программы не изменяется. Ее можно считать памятью, допускающей только счп.гывание, Область памяти для хранения данных организована в виде стека, и все арифмсгпчсскпс действия выполняются с двумя элемеитамп на вершине стека, причем результат записывается на мсс>о операндов, Верхний элемент алрссуется (индексируется) с помощью регпг>ра аг)>яи>ны стека Т. Регистр коиаяды 1 содержит команду, которая интерпретируется в данный момент.
Регистр адреса команды Р указывает следующую команду, которую нужно будет интерпретировать. Каждая процедура в машине ПЛ/О может содержать локальные переменные. Поскольку процедуры могут вызываться рекурсивио, память для этих переменных нельзя выделить до действительного обращения к процедуре. Следовательно, сегменты данных для отдельных процедур последовательно помещаются в стек В, Так как вызовы процедур строго подчинены схеме «первы>> вошел — последним вышелз, стек являстся подходящим способом размещении, Каждая процедура обладет своей собственной информацией: адресом команды се вызова (так называемым адресом возврата), н адресом сегмента данных вызвавшей ее процедуры.
Этп два адреса нужны для правильного возобновления рабогы программы после завершения работы процедуры. Их можно рассматривать как внутренние, или неяиные локальные переменные, помещаемые в сегменте данных процедуры. Мы называем их обрезом возврата КА и диначпческой связкой О(., Начало динамической цепочки, т, е. адрес размещенного последним сегмента данных, сохраняется в регистре базового адреса В. Поскольку действительное выделение памяти .происходит во время выполнения (пптерпретапип) программы, транслятор не может формировать рабочую программу с абсолютными адресами. Он может лишь задать расположение переменных внутри сегмента данных, поэтому способен выдавать только относительнсчг адреса.