Искусство программирования на Си (984073), страница 62
Текст из файла (страница 62)
епс/ а Да, это химический элемент Ан ЧОГС( РГЕЕвунтаХтгна ( аГГНСС авуатакведукк рРГЕЕВОау ) гч'-те(а/ л= "(чс" /ч'-те(а/-епс/ и Анализ был проделан довольно быстро и просто. поп-те(а! л=А-лап-тс(а/ ~ С-поп-те(а/ ~ /(/-лоп-те(а/ и В итоге оказалось, что это золото. А тсперь допустим, аСГНСС авуаеаХВОаук МЕХСаунеаХВОС(у = ИО( Ь( что имеются слсдуюшис входные данные: А-пап-те(а/ л= "А" А-поп-п(е(а/-еп(/ и ый11е (нругеевоау(=ИОЬЬ) — СС 1 Ди сн ( С-пап-те(а/ .:= "С" С-пос(-те(а/-ел(/ и Мехеауптахвоау = (чрргееВоду)->Мехтводу( /ч'-поп-те(а/ л= "Ас" Ас-лоп-те(а/-епс/ л Соответсгвуюший ряд вопросов и ответов окюкстся 11 [([ ругееВ ау)->Воауеоптенеа)(чМОЬЬ) несколько ллиннсс.
( А-те(а/. еле( з= "и" ~ '8" и Ггее([*рргееВоау)->Водуеопсепеа)( С-те(а/-епс/ л= "о" ) 'й" ! "е" и Химический элемент ) Металл Си 1гее ( *ругееводу ); /с/-те(а/-епс/ л= у(' и крРГЕЕВОау = МЕХС5унтаХВОС)у( А-лап-те(а/-епс1 л= "е" и А-мстаял Си ) С-поп-те(а/-епс/ л= 7" ~ етр(у и А Си «рРгеевоау = Иехеаупеахвоау( /(/-поп-те(а/-еп(/ г= "е" ~ етрЬ " Нет, нс А Си Нет, нс А-мсталл Си ! Дапаыните чьные та штичаакиеран(ачы Синп~акаичп л ии а ничик и аычиа ыние аыратении Часть )и Глава Гд Нет, не А Сз Следовательно, кюкдый идентификатор, например, бу- правило выражается связанной древовидной структурой.
са, ожилаюшие обработки и ешс не распознанные, тогНет, не А-металл Сз дст повторно проанализирован несколько раз, прежде У каждого узла этой структуры имеется свое имя (зк- да анкзиз завершается неудачно. В этом случае синтак- С-металл Сз чем будет найден подходящий его контекст. Такой под- вивалентное левой части правила синтаксиса), а также сическнй анализатор вынужден отменить свое последнее ход отнюдь не обязательно эффективен, однако он уп- одна илн несколько альтернатив (соотвстствуюших ле- решение и сделать альтернативный выбор.
Последним С Сз рошает понимание. вой части правила синтаксиса и разделенных вертикаль- является такое решение синтаксического анкзизатора, Да, это С Сг ными чертами). Кажлая ачьтсрнатива указывает на це- прн котором из абстрактного синтаксиса была выбрана Конец анализа С-металла С5 Интуитивные правила обычного языке почку элементов. А ка:клый элемент представляез собой конкретная альтернатива. При этом самый нижний элс...(Далее следуют строки анализ. на со алев следуют строки анализа на несоответствие Ка:кдое правило синтаксиса имеет простую интерпрс- указатель на синтаксический узел (именованный эле- мент отвергается, соответствующий узел синтаксичесо, в ичи г)... тацию на обычном языке.
В частности, "выражение сло- мент) либо на символьную строку. В пределах этих эле- кого анализа исключается и опробуется слсдуюшая аль- жсния — это выражение умножения или выражение ментов сушествуют и другие элементы, которые будут зернатива абстрактного синтаксиса. Этот процесс о Сэ сложения, за которым следует знак плюса и выражение рассмотрены лаосе в этой главе. псремс~ления вверх и вниз по деревьям продолжается до Нет, это не конец анализа Св умножения, либо выражение сложения, за которым Структура конкретного синтаксического анализа тех пор, пока анализ определенно не потерпит неудачу С-металла следует знак минуса и выразкение умножения".
Эту же представляет собой слинственнос дерево Каждый из его (т.с. когда возможных альтернатив уже больше нет и Нет, это не С-металл Св фразу можно выразить следующим образом: узлов указывает на олин конкретный узел абстрактного совпадение не обнаружено) либо окажется успешным. )Ч-металл Сг нпе-ехргечвап = гпа ггр ~са(пе-ехргеглап ) а Лле синтаксиса и альтернативу в пределах этого узла. Кро- Приведенное выше описание может показаться вам ехргахг(ап " " ма ар (саг(не-ехргеззюп а йпе-ехргехч(ап ме того, кажлый узел содержит послсдовазсльность (цс- несколько суховатым.
поэтому обратимся к конкретно- почку) элементов. А каждый элемент представляет со- му примеру. Допустим, что входной буфер содержит Нег, это не конец анализа С5 бой указатель на другой конкретный узел либо на вполне такое выражение: С-неметалла Увы, эти выражения ничем не напоминают те фра- опредсленную символьную строку. хне раздеаы иметь лва послслствия. Во-первых, оно препятствует бесполсзной работе синтаксического анализатора в тс- Сг(епгс!)ег-га!1 (1 а1гегиазе) зс)еззгз))ег-газ! (з а1гсглаге) етр1у Таблица !9,3. Синтаксический анализ исходного выражения 1еиег (б) !С)егзгг)) ег-га(! (!' айегпаге) Часть выражения Р)оскал транскрипция Имя анализируемого элемента выражение аЬс5 + хугб выражение логического сложения(первая альтернатива) аЬс5 в кутб выражениелогического умножения(пераая альтернатива) аЬс5 + хугб выражение включающего ИЛИ (первая альтернатива) аЬс5 н хухб выражение исключающего ИЛИ (первая альтернатива) аЬс5 + кутб выражение И (первая альтернатива) аЬс5 ч хугб выражение равенства (первая альтернатива) аЬс5 + хугб выражение отношения(первая альтернатива) аЬс5 + хугб выражение сдвига (пераая альтернатива) аЬс5 ч хугб выражение сложения (вторая альтернатива) аЬс5 + хугб выражение сложения (первая альтернатива) аЬс5 (еггег ('с) Ыепгз))ег-га!! (1' айегяазе) (епег Рекурсия входном б>фсрс.
Итак, синтаксичсский анализ продал жастся слслуюшим образом: !слег ('а) На этом этапе появляется ошибка. Начальный указатель указывает на символ "5", который опрслслснно нс является буквой (!епег). Поэтому эта ветвь исключается вплоть ло того места, в котором был слслан последний выбор. н вместо нес опробустся вторая альтернатива. Таким образом, конец привслснного выше синтаксического анализа получается слслуюшим: !еиег ('а) А тспсрь рассмотрим слслуюший прслполагаслзый элсмснт синтаксиса, который относится к остальной части выражсния рптагу-ехргезлаи (основное яыразксние).
В конечном счстс синтаксический аназиз привслст к созданию структуры, описанной в табл. !9.3. Во всем рассматриваемом злссь процессе выполняются рекурсивные процедуры, т.с. такие процслуры, которые взлзывают сами себя косвенно или явно В рекурсии, собственно, нет ничего плохого, оннако при сс выполнении непременно необходимо избежать бесконечной ехргеятоп (одюа)-ОР-ехргееаюп ( ! н а!1епза(е) (од(са1-АРР-ехргеев1ол (!м айегпа(е) (пс(изме-ОР-ехргеаззол ( !" а!1егпа1е) ехсгиявс-ОР-екргеаз!оп (1 н а((егпа1е) АГЛО-екргеязюп ( ! и алеша (е ) еаиауяу-ехргеаяюп (! и авегпа(е) ге)а!зола)-екргеаяюл ( ! и а!1егпа1е) нттбекргеьяюп (1и аиегпа(е) ааатве-ехргеьяюп (2 аиегпа1е) аааггзне-ехргеззюп (1и а!(егпа1е) С ннтнксн нескин ннн зиз н нычисзенне нырнзн енин Глава 1Я чение нсопрелслснного времени, а во-вторых, оно прс лупрсжласт пользователя об ошибке в исхолном синтак сисе.
Липинпитепьные темитинесн причини вв — —— Часть и! Для обнаружения бесконсчной рекурсии в пронес- Ошибки в синтвкснсв вхгпсг ввупсахволу ТЫвволу( сс ввода нового заголовка (узла) в дерево анализа на 1пг (ьсодевепегаге) ( ио(Д» ); Похоже, что лало принимает ешс более скверный обокажзом этапе синтаксичсский анализатор может снова рот. Обратил ли читатель внимание на то, по в лвух (пх ЬьавГСЬаг; попытаться найти орели всех предыдущих узюв такой, послслних примсрал правия синтаксиса имеется еще олна серьезная ошибка! На самом деле ле сушествуез узел, имя и значения котооого совпадают с теми, на которые указывают входной и выходной указатели. вхгпсх ввупгахтаЫе51евепг ( Рсл т . й Узел имеется, , воз 1ожно.
придется вор- Об ' 1 (, Ь И Ь Ь И сваг вупхахваве[вувтвд ИаНК Ьвввтв+1(З встствуст. Оба определения, а(р(сайеас( и Ьегайеае(, монуться в то жс самое состояние, которое соотвстствуст вггпсх ввувгахВеабь рвупхахво(пхег( тут вообгле оказаться бесконечными, даже в абстракт- гпх 151агхвв1ГЫ( п оцесса анализа, и установить ном смысле.
Каким жс образом можно гарантировать хпх 1лпагсопгазп( отсутствие полобной ошибки в намного более сложном состоянис ошибки. ): Рекурсивные пра Рек сивные правила могут быть скрытыми. Рас- синтаксисе выражений, неписаных на языке С? смотрим следующий синтаксис вхгпсг вА11егпахетаЬ1ев1евепх ( Вероятно, читателю булст приятно узнать, что, котла а1рла з= а(рлалеас( "Ь" ~ легавое( "с" № гарантируется отсутствие бесконечных рекурсивных и(ряа11еас(: — — Ьегалеас( "а" ! "Ь" а(ряаяеас( № путей во всем сиьыаксисс, рекурсия должна всегда быть 1пг 151аггвв11Ь( Ьегалеас( х= а(рйа11еас( "Ь" ( "а" Ьегаяеаьг № консчной.
Поэтому 1арантия отсутствия бесконечной хпх 1впвгсопге1пз рекурсии в синтаксисе приобретает вссьма важное знаМожно ли здесь сразу же заметить рекурсию". Она чсние В коро~ком синтаксисе это можно определить на вхгпсх ввопх(певаветаЫев1евепс ( присутствует в последней парс правил.
Когда синтак- глаз. А лля более ллинного синтаксиса существуют инсЬаг пдевеводу(ВОВТ1НВ НАНВ ЬВВСТВ+1); Сии тип синеснии ахать и нмниюение пмратенна Глава (9 МЙИ Сан»пале и»ел» на анализ и ни числе и не аирпне ее к» ф$ Дапапннп~епьниенлечалпичеекнера»3» и 6И вЂ” '- Яф Часть ГМ гпг Расее Глава (9 чогд Ргее5упгах1геа ( вггнсг ввупТахВоду** рРгееВоду ); лпг гп,ооТ,Ыпврасея; чогд 5ВЕрврасев [ гпг* ) ); гпг Сегвупгахваае ( сЬаг* вупгахЫпе, Ь|п5расея = РАЬВЕ; ) )' г=ю; чо(д Кеаочеврасев ( сЬаг' 1прпгвп((ег ); [ г =ю; (( (п<РАВВВ ВВРРВВ ьемств ) ая ( 1прптво((ег[ [и )[ = ' (е ' ) ); (п»» ) Епг» вггпсТ ввупгахВоду* рвупгахр, гу (Ыпврасев) вггосг вРагвеводе'* рррагвеВоду ); ( гпг СегвечрагвеВоду ( вггпсг врагвеводе* ррагепТВеад, 11 ([[вярасе(1прпгво((ег[гп))) яггасг врагвеводе' РРгечгопвВоду, ( МечВ д ); 1прогвп1(ег[опг»») 1прпТВп11ег[1п); гпг ВЫ1двечрагвеВоду ( яггесг вРагяеМоде* ррагепгвеад, Ыпврасев РАББЕ; вТгасг врагвеМоде' РРгеч[опвВоду, ) вггпсТ врагвеМоде»* ррвееВоду, ) 1пТ ТРлгвТСЬаг, 1пг гВавТСЬаг ); ( ( сЬаг*» рр1прпТВп11ег, 11 (гвврасе(1прпгвп((ег[гп))) гпТ* вггпсг явупгахВеад рхоо(5, Ыпврасев сев - тВВЕ; вТгпсг врагяеводе'» Р рхооТР 1прпсво((ег[опг++) тпг СепегагеОегреТСоде ( вггпсг врагъеводе' рхооТР ); ) Синит к с икеский анализ и нынисс ение нырам ении Дапаенип санные тематические ран)есы ЕШ к Часта О! Глава 19 гесагп 1БЬахав; ) геспгп 1БКаспв; ) (пс рагсЬаг ( чо(О* опе ( гпх 1БСахпя; (е(сЬаг*)опе= ' 11') (*(сЬаг')опе==' 1 ')) геьпгп ТБГахов ) 1БСахов РЬ1БК; гегагп (вьаьпв; (вхаьпв=ТАБЕ( ) е1ъе ТБСавпв = РХЬБК; гу ((*(сЬагн)опе=='(''] (н(сЬагк)опе==' 12') ( (вьахвя РЬЬБК( ) е1ве 1БСахпяпТАОЕ; гпь ТгуНахсЬРагве ( сЬаг"* рр1прпГВаууег, гпг* )с, вхгпсс ввупьахВосу* рвупьахр, всгпсс врагяеНове** ррРагвеВос)у ) гпх )ввахая ТАБЕ; 1пс 'ВовувхгьпОЬепОГЬ; 'пс ЬЬ аь; всгпсс ярагвеВосе* рнечрагяе - ВОЬЬ сЬаг *рьпраГВо((ег; 1( (рвупхахр->Вон)уеопсепхв(пНОЬЬ) ( (воВУБГг(пБЬепБКЬ = вхгьеп(РБУпхахр->ВоСУОопсепьв) ((19оСУБхг)пОЬепОСЬ + «)>РЬАБК ВОРРКА ЬКНОТВ) Доаолн июеа иные нее ионе« «ееи ив ри и)ели йя< Часть <й Сини~анси нчъ ии ани ~а« и выч «воен ив выра зееиии Гаева 19 <пс ЯЬ1рмехсвупсах (всгпсс вяупсахВобу** РРЯупгахР ) ( ( *ррйооСР = аа11ос(вгхеоу (всгпст врагвейобе)); Ьпс <йесагп = РЬЬЯЕ; 11 ((*ррйооср) =МОЬЬ) ( 11 (<(«РРЯувтагр)->Ра ПСЬ11- НЕХГЬ11)<=НОЬЬ) 151аспв = ЕЛЬНЕ; ( геспгп гЯсасав; «ррвупсахр = <ерряупьахр)->Рагепьй)Г->Мехсй)С- ТЬ<вВобу; ) ) [*ррйооср)->Рагепсрагве МОЬЬ; ху <(*ррвупсахр)1«МОЬЬ) (еррйооср)->Мехтрагве МОЬЬ; гйеспгп = ТВОЕ; (*ррйооСР)->Ргет1опяРагве = МОЬЬ< ('ррйооср)->ТЬьвйеаб рйоогв; (еррйооГР)->ТЬгвВобу НОЬЬ; ) ( ррйооСР)->ТЬЬврагве НОЬЬ; иогб РгьпсРагвеТгее ( втгпсс вРагвейобе* р1врпт, <пс берсЛ ) (еррйоосР)->СобеСепегате МОЬЬ; (еррй гр)- ЬР(гвССЬ 0; втгпсь ярагвейобе* ррагвейобе; <еррйооср)->ТЬавССЬаг -1; ) пеыоерСЬ = берГЬ+1 1 ( РРагвевобе = р1прпс; ) ейг1е (ррагвенобе<=МОЬЬ) Глава 19 ПИ- ' ° /]она.