Virt N. Algoritmy struktury dannyh = programmy (ru)(T)(410s) (522393), страница 63
Текст из файла (страница 63)
а + 2 а Ь 2 При трансляции с языков программирования обычно при. ходится решать значительно более сложные задачи, чем те, которые решал транслятор с языка ПЛ/О для машины ПЛ/О 15.4). Большинство пз них с гораздо большим трудом поддаются четкой организации.
Если читатель попытается расширить данный транслятор, приспособив его либо для более мощного языка, либо для более привычной вычислительной машины, то ои вскоре убедится в правоте этого утверждения. Тем не менее основной изложенный здесь подход к разработке сложных программ по-прехгнему остается в силе, и его ценность даже возрастает в случае более тонких и сложных задач, Оа действительно успешно применялся при построении крупных трансляторов [5.1, 5.91. ( число зарезервированных слов) (длина таблицы имен) (максимальное количество циФр в числах) (длина имен) (максимальный адрес ) (максимальная глубина вложенности блоков) (размер массива кодов) ргоагат РуО(»рнг,он!рн!); (лранслятор с ПЛ/О с Формированием рабочей программы) )аЬе! 99; сола)ло!ча = 11; 1:о»ах = 100;.
тпах = 14; а1= 10; алгах = 2047; 1егюах = 3; схтах =- 200; !уре югл!Ь»1 = (п»1, Ие»1, пил!Ьсг, Рйсц ли»из, !Ьнеа з!аз1!, ог)с)гуп!, сд1, псу, 1зю, 1ец, егг, еец, 1рагеп, грагеп, со»!та, юеп!1со1»п, репой, Ьесоты, Ьекй!гд»п, епйул!, фуги, !Ьелзуп!, !гй11есу»!„возу»!, са11зуп!, сонг!гул!, тату!», ргос!угп); а)1а = расЕей а!!ау (1 ., а1) о! сйаг; оЬ/ес! == (сопз!апг, уа! !»Ь)е, ргосе!!иге); гунне! = ве! о)гул!Ьо!; )с! =- (Йг, орг,!»с1, зго, с»1, БН, З!»р, !ус); (Функции) й!з!гис!!он = рас)!ей гесогй г": усг; (код Функции) 1; О .. 1егтах; (уровень) а: О,, атах; (смещение) еай; ыт О,а: загрузка константы а Оел О,а: выполнение операции а ьоо 1,и: загрузка переменной 1а зто 1,а: зались переменной 1а сА!.
1,а: вызов процедуры а на уровне 1 тт О,а: увеличение 1-регистра на а зче О,а: переход на а згс О,а: условный переход на а ) чае сБ: сйаг; (последний прочитанный входной символ) гул!: зутБ»1; 1»оследний прочитанный символ языка) И: аКа; ! последнее прочитанное имя) лит; !лгсесг; (последнее прочитанное число) сс; Б!!снег; (счетчик символов) 11: !пгсесг; (длина строки) Ис, егг: и!!е8ег; сх: !и!е8ег; (индекс размещения команды) йпе ! ахсау !1, . 81) о! сйаг; а: »11а; соде ! атсау !О, . схтах) о) !пз!гас!!оп; ггогс1: аггау !1 .. !гоги) ог" а11г!,' гогу!и: аггау !! .. лог !г) ог" яг!ггЬо1; югул!: аггау !сраг1 оу гул!Ьо1; лглелгол!с; апау11с!) о1 рас!год аггау 1! ..
5) оГ сЬаг; йес(Ьеууз, вгигЬсеггп гасЬ, узуз: зутгег; гаЬ1е: аггау !О, . !галах) ор гесогд лал!е: а!си; саве Ь1пг1; оЬгсс! о! сола!оп!: (ги1: !г!гееег); гаг1аЬ1е, ргоссидае: !1егс1, агЬ': глгеуег) епд; ргоседпге сггог!и: !лкуег); Ъерп ггг1геЬ!!' о4~г', ' ': сс — 1, '!', п: 2); егг:= егг+1 епд !ег! ог); ргеседиге «еггугл; таг 01,7с: !пгсдег; ргоседпге ее!ей; Ъерп 1! сс = П гЪеп Ъед!и !! еоЯлри!) 1Ъеп Ъерп пг!!е! еноиаам !исомеите)! по!о 99 епд; .'1:== 0; сс;= 0; !гг1гс1с»: 5, ' '); пдд1е —,сор!(ври!) !до Ъерп П:= И+ 1; гсаг11сЬ)! ггг!!и1сЦ: 11ле[П):= сЬ епд; ге!1!срг; П:=- 1!+10 геай(дне~И)) епд; сс:=- се+1; сЬ: Плегсс) епд !ее!сЬ); Ъер!п !де!гул!) пЪ11е сЬ .=- ' ' до «е!сЬ; 11 сЬ 1п !'А',, '2') ГЪеп Ъерп !игия или зарезервироваиное слово) Й:= 0; гереа! !1 й < а1 !Ъеп Ъерпй:= Ь+1; а!Ь):= сЬ епд; дегсЬ !!! — 1сЬ Ра ГЛ,.
т,'0' .. 'Э'))! !! 1! > ЬЬгЪепЬЬ:= йе1ае гереа! а!ЬЬ):=- ' ', Ай! И вЂ” $ пп61 И =- й; ркееейпге ел!ег(1с: о(уес!)! Вери (запись обьекта в таблицу) !х:= !х+ 1; Ма!Ь !аЫе(!х» йе Ьеп!и лате;= И; Илй:= 1с; ееее 1с оГ соле!ил!: Ьерп !1 лит > атах 1Ьеп Ьерп еггог (3 0); лит .'= 0 епй; га1 '.= лит епй; уа«1аЫе; Ьерп 1еие1:= 1еу~ ай':= с(х; бх ~ * бх+11 епй; ргосеаиге: 1ече1;= 1еу епй епй епй (ел!ег»; Типе!(оп роыг1ол(И: аПа); !л!оке«! та« 1: и!екег; Ьеп!и (поиск имени И в таблице> гоЫе[о» .лате:.= И; 1;= — гх; ъ!н!е гоЫеЯ .лате ~ Ийо 1:= 1-11 оотг!ол:= ! епй (роя!!ол»; ргееейаге солвИес!агабол; Ьерп !! оут = Иел! !Ьеп Ьеп!п есгсут; !1 вут!п (сд1,Ьесотег» !Ьеп Ьерп !!аут = Ьесотез ЬЬеп еггог(!); ее«5ут; !(сут = литбег 1Ьеп Ьее!и ел!ег(сот!ал!) ! ке!оут епй е1ее еггог (2) епй е!зе еггог (3) епй е!ее еггог (4) епй (сотИес1агог!ол»; рпкейпге та«асс!ага!!ол ! Ьеп!и !1юут = Иел! !Ьеп Ьерп ел!ег(еапаЫе); ке!аул! епй е)ее ее«о« (4) епй (гагйес1агабол»; ргосейаге 11з!соае; тат 1: 1п!ееег; Ъеп1п 1ог т:=, схО !о сх — 1 йо ят1й соае[1) йо ит1те1п(1, тпегиоп1с[Д: 5, 1! 3, а: 5) епй [11зтсоае); ртоссйпте зта!еп!еп!(1зуз: зуп!зе!); тат т,сх!,сх2: !и!сеет; ртосейите ехргезз1оп(Ях зутзе!); тат айг1ор: з>тдо1; ргосейпге !егт(1зуз: зутзе!); тат гии1ор: зу!пдо1; ртосейате ~ас!ог ()зуз: зутзе!); тат !".
1п!ееег; Ьер1п тез!(~асдейзуз,,гзуз, 24); ттЬ!!е зут 1п ~асдеууз йо Ьеп1п 1тзуп! = !21еп! йеп Ьеезп 1:=- роз!!1оп(!г1); 11!' = — О йеп сггог (11) е1яе тт11Ь !аЫе[1) йо саяе Ь1пг! оГ соиз!аи1: .есп(111, О, та1); таг1аЫе. 'иеп(1о!1, 1ет-1еье1, айг); ргосейиге: еггог (21) епй ! ее!зут епй е1яе И тут =- питЬег йеп Ъеп1п И'и!!т > птах йеп Ьео1п с!тот(30); пап!:=- О епй; исп(111, О, >вт); ес!зупт епй е1яе ьЕ тут = 1рагсп йеп Ъеьйп ис!зтгп; ехргсзз!опфрагеп)+~туз); 1(зут =- грагеп йеп ие!з1 и е)яе еггог (22) епй; !ез1(гзуз, [1рагеп), 23) епй епй (/ас!ог); М.ьут = сопх!аут Йеп Ьепьп .есйуьи; торса! соияИес7агагюи; ъЬ11ееут = согнтадо Ьепьп ее!аут; сотгь7сс7агаг(о~ епй; 'ьЕ ау!!! = «ет7со!он Йеп ее!лунь е1ее еггог (5) пи!11 еуеп ,-е Ион! опав; 11 ау!!! = ьагьуььь Йеп Ьеп1п «сььуььь; кереаь сап!ос!ага!!о!!; пЬ11е югнь = гонт!а до Ьее(п ее гьут; ь'агь7сс7агаь!Ьгг епьь; 11юут = кеигко7ои ьЬеп ее!аут е)ее еггог (5) пп61 ьук ~ Ыст; епй; п Ь11е лунь = угасну!и до Ьепьп рсгьуььь; 11яугьь =- 7г7сы! Йеп Ьееьп с!нег(ргоссг7ыгс); ос!я'гп епьь е(ое стог (4); И яуььь =.=.
гонь!со!о!! Йеп ее!ау!!! е1ее еггт (5); Ыо г7с(!е е+ 1,гк,'Ььеьь ысо7огь) +Угу); 17 гчни =.- ос!!!!со!о!! Йеп Ьепьп ь сггугьь; 7сг! (ьгаьЪеууг+ (Ыеььь, уголунь), Яз, 9 опав еьее с!нос (5) а; ьсьь(ььагЪсдОп.(~ьь7сьь!), ь7ес7Ъеезуг, 7) ппйь1 —.(юугьь 1п <!ее(Ъеаьу4; со!7с(гаЪ7е(гхО),аь7!').а:= сх; пьЙ гаЪ|с(ькО) ь1о ьепьп ась!':= сх; (качальноьй «дрес койьинд\ епь7; саО: сх; еен(~нь,О,ь7к); гаагсньеьн((ьепь!со!он, егьь7ьугн]+~сую)! ' дсы(орг,О,О); (!'сгыьн) гсьь(7ьух, [ ), 8); 77ггсоь7е; епь1 (Ъ7ос7г); рсоеейпсе !птеср~ ес; еопе! зсас!сз!ге = 500; тпср,Ь,с: !псеке! [региспср программы„регистр указателя стека, базовый регистр) 1: й~зссисс!ап; [регистр команды) з: ассау [1 ..
зсасрзтхе) оТ !я!егер; [память для дивных) йпс!!оп Ьазе(1: и!."ясс): !псееес; тес И; в!гесс; Ьеп1п И с= Ь; (поиск базы ! уровнями нихе') пЬ1!е ! > Оде ЬеФп Ы:= л[Ы); 1:= ! — 1 епй; Ьазе:= И епй [Ьахе); Ъее)п ос!се!и( зтяйт г1 уо); с:= О; Ь:=1; 1:=- О; ю[Ц: — — 0; я[2):.=: 0; зЯ:=- О; гереас 1:= састс[р]; р '.==- р+1; п1сЬ ! оо саяе,!'оГ !!з: Ьерп!:=- !+1; з[!):= а епд; орс! сазе а оГ (операция) О: Ьеп1п [возврат) з:= Ь вЂ” 1; р ."= а[с+3); Ь:= я[с+21; епд 1 1: в[!1;= -з[!); 2: Ьеп1п т:= ! — 1; з[!):= з[!) + з[с+Ц епд; 3: Ьее1п т:= ! — 1; я[!1:= з[!) — з[! 1-Ц епд; 4: Ьеп1п!:=- ! — 1; юИ:= я[с) е з[с+Ц епд; 5; Ьеп1п с::= ! — 1; х[!):= зК 4!с з[с+Ц епй," б: в[с):= о~д(ай!(Ф!)); 8: Ьее1п с:=- ! — 1; в[!1 им огФ(х[!)=з[с+Ц) епй; 9: Ьеп1п с:=- ! — 1; з[с):= осс!ЩФз[с+Ц) епд; 10: Ьеп1п с;= ! — 1; з[!):= опйр[!)(з[с+Ц) епй 1 11: Ъее(п 1:= ! — 1; яК:= огг![яЯ)я[!+1)) епо; 12: Ъе81п я:=- Я вЂ” 1; Я[г]:=- огг)[Я(г]>я[Я+1]) епд; 13: Ьед!п я;= я — 1; я[г]:= огЫ(ф]<:я(я+Ц) епй; епо; !ос!: Ье81п я:== !+1; я(г]:=- я(баяе[!)+а» епо; яяо: Ье8!и я(баяе(!)+а]:= .ф]; игИе!а[я[!]); я:= ! — 1 епа; са1: Ье81п [Формирование отметки в новом блоке] я[я+Ц:= баяе(!);,ф+2]:= б; я[я+3]:= р; б:= я+1; р:=- а ев1; ?пяя я;= !+а; .!пр: р:= а; !рс; Ъед]п 1!я[я] = 0 лепр:= а; 1:= ! — 1 епй епй [1ЕИ!ь саяе) пп111р = О; итие( ено ие!о'); епй [!и!сгрге! ]; Ъе81п (основная программа] Гоя сб:= 'А' 1о ' йо яя)лл(сб]:= гт1; иогс!( Ц .'= 'Вееин'; 1сога( 2] .'= 'сА1л иогг!( 3]:= 'сонат'; яеогг![ 4]:= 'оо 1гогг![ 5];= 'ено ', иогя![ 6] ."=- ле иогг)[ 7]:= 'ооо '; '1гогй[ 8]:= 'еиосеоиие'; иогб[ 9]:= тнен '; иогг![10]:= иди и'огг![1Ц:= 'и/и~ее '; яся)ггл( Ц:= бее!пяут; три[ 2];= са!!яут; гсяут( 3]:=- соляияугп; ивув( 4]:= г!ояув; ияув[ 5]:= ев!яугп; ияут[ 6]:= !7яув; ия)вл[ 7]:= ой!явит; ияув( 8]:= ргосяут; ягяуп1[ 9]:= яйсг|я>яг1; ияут[10];= иагяут; ивув[1Ц:= иб!!ея)л1; яяугп['т'] ~= р!ия; яяугл[" — '] ',= т!пия; яяупя('е']:= я!тся; яхт('!']:= я!аяб; 'яяут('(']:= !1яагсг~; яяут[)']:= грагсп; яяут['=']:= еа1; яяугп[',']:= сотта; яяут['.']: = рег!ос(; яяутГФ']: = не~у; яяуолГ<']:=- !яя; .яяут[')']:= егг; Ъкут[.
']:= !щ; яяупг(')']: — 8ед; б. Структура языков п трансляторы хаут!'">:= хет(со)ол; тлетолус(777'7:= 'Нт ", тле!>гоп(сарг):= ОРН", тлегпопЯой>:= ч.о>>'; тпетои(с(а(о1;= 'кто", л>потоп(с(са)):= 'сдь'! тпетол(с(7иг): иыт '; тпетог>7сЦ>пр1 .'= Оглр'! тиетог>(сЦрс):= 'зрс'; йес)беХгуг: = (сола(гул!, та!тут, ргосхут),' х(а!беда>х:= (Ьед(лгут, са!Вут, (7гут, тгб(7егуп>1; ,)асбейггг:= ((йспг, иитбег, 7рагеи); ' раХе(ои(рн(); егг:= О сс:= О; сх:= О; 77:= О; сб:=- ' '; 7г(с:= а7; ае(тут; ,Ь(ос)г(О,О,( рег(ой )-(- йес7бергут -, 'ггагбеХгуг); )Тг)тр Ф репой йеп еггог (9); Ы егг = О ((теп т(егрге( е!ке нтйге( йпйоя6 ич рь(о рноанд>л); 99: нг(ге(г' епй . Программа 6.6.
Транслятор для ПЛ76 УПРАЖНЕНИЯ оЛ. Рассмотрим слсдуюшнй сннтакснс; Вх=А Ах= В(И А Итеп А е(зе А Вс=С(В+С(+С С::э В)С*В)эВ Вс .т((А) ( — 0 Каковы здесь термянзльяые н нетермкна>к ные символы? Определите множества самых левых и внешнях символов С(Х) я г(Х) для каж. дого нстермннального символа Х. Постройте последовзтельность ша. гов грамматюпекого разбора для следуюшпх предложеннй> х+х (х+ х) ° (+ — х) (х э — + х) И с+ х теп х эх е(зе — х И х !Пап И вЂ” х Ичеп х е(ае х+ х е>зе х*х И вЂ” х И>еп х е(ве И .т Рлеп х+ х е>ве х 6.2.