Искусство программирования на Си (984073), страница 66
Текст из файла (страница 66)
Хотелось бы за- гаШе ареегдгег ° йввх Я 35 означает, что пцпх является строкой, кодать примерно следующее: торая по длине нс может превышать 35 байтов (без вресьсгегь оае от Минуточку — название библиотеки "ь)1!)я(.Ь" в ка1аг Арр11саг1олнагл (еаъг *1лд11е, еиаг аи(ссхаре<111ег учета символа конца стооки). вычках? Да, мы собираемся снова использовать коды, ьоаСС11е, 1пг орсв1а9) доабзеаресгггег Можно обеспечить любое количество спсцификато- которые разработали ранее в этой кингс. Где-то жс нуж1опсаре<111ег /* ...
*/ ров, хотя нужно помнить, что соответствующая реали- но хранить наши иерем<нные. Порядок переменных агг1вчаресг(гег ) зация не обязана поддерживать списки параметров фун- очень важен, и обязательно нужно несколько раз провя11<каресШегь кций более чем с 127 параметрами. Но такого их смотреть список переменных, чтобы сдслатьдвусвязный и позволить генератору кода позаботиться обо всем осталь-(ееасШег количества должно быть достаточно.
список более подходящим. Поэтому следует снова найноч Конечно, аргументы функции Арр))са()опМаш() Если мы задали генератору кода вхолныс данные ти и использовать библиотеку, которая была разработабудут разными е разных программах. Это неулобно Мо- еоебьеарес111егь этого примера, мы хотели бы использовать их для про- на в главе 1!.
жст ли в решении этой проблемы помо )ь сам генератор ааеаШ>ег О изводства кода, который считывает и понимает строку лола? дстатитсеон ни т счот и не си не ра ива и Созданье арсирачмннсс инстр>мента.вныс средсте Часть Н1 Глава 20 имеющие состояния "включено" или "выключено") не- то получить, для чего используем функцию <йе1().
Это саве оат ЧАЕ1АВЬЕс 11(вгг1еп[дагмаве) > НАХ Хвват ЬЕН) удобны для работы, так как они не похожи на другие ловольно живучая функция, которая не позволит псре- Чагмаве = вгггок(мехГТокеп, Ое11ва); НехЕТокпп = Нпььс БГ Е ЕХ1Т РА1ЬОЕЕ" три типа. Решение разработать грамлсатику таким обра- полнить входной буфер. Этз функция обычно оставляЯеаее = ВТОР( зом принято просто с тем, чтобы показать, что и с та- ст 'лв' в коппс выхолных данных (исктюченис состав- При получении маркера от буфера данных для лучкой громоздкой грамматикой можно работать, сели дс- лают случаи, когда объем данных превышает шей работы функции а(г(ойО требуется знать, проислое1ае пать это осторожно. Может быть, вы сможете пространство для их хранения), но мы можем просто дит ли пополнение буфера.
Поэтому здесь использует- ( усовершенствовать грамматику и соответственно огре- вставить Лп' в строку ограничителей разметки. ся функция (ч<ех1ТО)сев, которая указывает на буфер Если же переменная нс является переключателем, то дактировзть синтаксический анализатор. Е(св О Г ) НОВЫХ ЛаННЫХ ИЛН НИКУда Нс УКаЗЫВаЕт, В ЗаВИСИМОСтИ гя(сНачппаеа) нужно, во-первых, сохранить копию имени псременТеперь поговорим о хранении данных.
Синтаксичес( от того, имеется ли действительно в данный момент ной, а во-вторых, изменить состояние конечного автокий анализатор должен помещать полученную инфор- Оаеа = (дега(1пВпг(, а1геог 1пВп(1„ новая информация. Функция (ч(ех(ТО(сев при получении манию в некоторого рода контейнер. Для этого потре- 1пвегеав); новых данных снова указывает на буфер данныл в на(1<вага (и НОЬЦ Между прочим, в структуре аргумента требуется бустся довольно простая конструкция. чапе цикла.
< функпия Я(гсруО Когда происхолит событие появления Если при разметке произойлет сбой, переменная ЕУР апт пегас~ АВЯОМЕНТ Хрг<пс((ьодяегеав, р р р ' р спсцифпкатора типа в отдсльнои строке ввода, название ( "Ягаеав герогг: Сог дага НачеВВ1а устанагшивается в нуль. Таким об агом фопсремсннои переписывается с помощью функции Гйе(о, спаг Наве(НАХ 1ОВНТ ЬЕН)1 аауп мально регистрируется ошибка в начале цикла, который поэтому такое событие нужно по возможности псрехвагпе ТУРе( 1пВп(1); после э сото получит некоторыс дополнительные ланныс вгге Г Ьеп; /' (ог вгггпдв */ Начеоага = 1; для своей работы тить. Аяооментс НЕХГТОХЕП = 1ПВП(11 еегсру(агд.нате, чагнтае)с ) гг(уагвавп == ЗПЛЫ Яеасе = 6ЕТ ТХРЕ; гпе Рагаегпрпе<ОЬЫят *нагдщаг, еьае < Свидание присриим них и нес п рума нтаи ьних средств 6П~ — ' Допьиьните'ььние теиитинссниеравд<еи Часть Ш Глава 20 ) его происхождение.
Насколько зто нажно, мы увидим Жестко запрограммированныс здесь значения 4 и 6 Агд.яеп = О; е1яе позднее. Не забультс, что необходимо добавить коммсн- специфичны для этого приложения. В обшсм, "магичесьт(Чагтуре(а) == ятетип) ( гарни к сгенерированному коду, и в целом онн нс на- кис числа" этого вила представляют собой неудачную ( — столько важны, как в обычном коле.
Но сели в иенс- практику программирования, потому что делают проЯеаее = ВЕт ЬЕН) ) ) ) рированном коле только один комментарий, то пусть он грамму более сложной лля внесения излеснсний Олнае1яе ) сообшает слслуюшес. "Это сгенерированный исходный ко причин, по которым приходилось бы изменять эти ( Ьгеах; код". льагичсские числа, в лсйствительности нет, кроче тех ьт(ОЬ БОССЕББ )и ОЬАррепд(хгдеьяе, Ве(ап1Сь случаев, котла требуется изменить параметр синтакси- О, /* о */ Листинг 20.7. Результат генерированиа исхоДного са в программе или котла это лолжно повлечь за собой БАгд, а(хео( Агд)) Если мы встретились с йеуавИЬ то появилась прокода. рс~спсрацию кола (и, таким образом, автоматическос ( брема, поскольку состояния конечно~о автомата конт- /' агдргое.с */ обновление этих чисел).
Во всяком случае, булст отноЯеаепя = ЕХ)т РА)БОВЕ; ролируются изнутри; поэтому неизвестное состояние / Автоматвческв сгенерврованнмй файл. этот сительно просто нейтрализовать эти осложнении, если Беаее = ВТОР; характеризу ст нарушение программы. * файл вручвуп не модвфвввруйте. Вместо этого возникнет определенная причина лля беспокойства. ) * взменате депагдя.с в регевервруйте файл. е1яе аяаеее(О); /* Эеа проереииа паркмена */ */ Еоа (ТпьаАхд = 1, С<аарлед = О; ТЬ1яАхд < аедсе ( БСаее = ВТОР; (спс1пце <яецсо.в> твйапед++) ясасе = яет члктавье; Яеаее = ЕХ)т УА1ЬОЯЕ) фтпс1пде <яСЛ11Ь.Ь> Ьгеах; $1п<1пае <яег1пд.Ь> х((агдч(теьалгд))0) == Яиттее СВАЛ) ) ) ) йде(ьпе БН1ТСВ СВАВ 1((яетсмр(с-хпеегпа1', атдч(ТЬьяАгд)) == Е) Дина енитееьние темат ические ран>ееи Сн»а и не при > роме та» и нетр>мента>ними ертьене Часть )и Глава ?О зт[вгг1еп(агди[ть?вАгд)) > 255) удаление слишком затрудняло бы работу генератора ку с вызовами функции Гые(а().
чтобы сделать справоч- ПрОСтОй ГЕНЕратОр КОда кода. Готовы ли вы иметь дело с дополнительным объе- ныс сообщения более легкими для чтения. Эту часть геспгп ТЬ1влгд; мом выходного кола, в основном определяется тем, на- процссса можно у пр ти ь Мы будем снабжать г е аписанн>ю на пР'"РаммУ ь . Р Написанную на С п амм на высоком у овне можвсгсру(агдр >Ь Р 1 „[ТЬ1 А [). СКОЛЬКО ДОЛГИМ И трупным вы хотите сделать процесс ратор кола текстовым файлом, содержащим текст, ко- о те . Р Р Р Р, но разлелить на три части: директивы препроцессора, Ьгеах; разработки генератора кода. торый будет в авлен в Не[р(), так почему мы не мо- определение типов и функции. У нас сеть лвс функции, ) прсдна>наченныс для генерирования, поэтому генсражсм просто систематизировать его солсржанис так, саве Зе чтобы файл помощи был доступен во время выполне- тор кода будет сос пить из т Р то кода булет состоять из четы ех элементарных про( Ь е, >, ЦЕДУР: ОДНОЙ вЂ” ДЛЯ ЛИРСКтна ПРСПРОЦЕССОРа, ОДНОЙ— 1[(агг?еп(агди[ТЬ1влгд)) > 255) сваг е Опсы11е, ния программы'! Г[роблсма с таким решением состоит ( сьаг Ьодв11е, е в точ, что файл помощи предполагается доступным во для определения типов и двух — для функций.
спас ' Ые1РВ[1е)) время выполнения. А что если это нс так? Встраивая Функция УдгйеНеадегп отвечает за директивы прспро) иоЫ Ые)р(но[О); файл в генерируемый код, мы гарантируслц что текст " о>РА Порвал зада цессора. Ее первая задача состоит в том, чтобы пометить ве ру(агдр >Ые1рр11е, агди[ТЬзвАгд))) Оз~ М'р(чо")Г всегда, когда потребуется, будет доступен. результирующий кол его именем файла вместе с предупреждением о том, что код сгенсрирован автоматически. 1пс аа1п(1пе агдс, сЬаг ееагдп) ) ( Управление сопровождением Для этого, естественно, функция 5уг[(енеааег() использпг Бгаепа; зует синтаксис комментария. зпе Агдыеяп1Г; ++Соарлгд; Если вам потрсбуетсЯ внести изменениа в выхолной После этого нужно просто написать несколько опе.) АВО Агдьывс = (Е); РезУльтат генератора кола, вссгла измснайте сам гене- раторов В[Ос[оде и В[[елпе.
требуемый точный состав ) Ратор, а нс Результирующий кол. Если же вы измените этих операторов булет разным в различных генераторах. Агдвеап11 = СеЕАгдв(агдс, агди, САгдй(ае); 1((лгдвевп11 )м О) рсзультируюгдий код, то эти изменения потеряются, Вполне может оказаться, что вы вообще не захотите Создание ароерзимиыз инструмаваалониг средств нее кое раздели Глава 20 лепсо создать тип АКВЬ Для этого нужно организовать Бые (.
Хотя это целый тип без знака, однако мы не знаем Соарагдв = ОЬСеппе(хгдшве) — Оргхгдвз обычный цикл по списку. точно, какого он вида, поэтому перед передачей его Особенно следует позаботиться о двух моментах в функции Урйп((() нужно выполнить приведение типа. случае использования константы ВТК!(и(О. Первое, <то Пользователи мэйнфреймовских машин в зависимо- Нашси первой задачей является генерирование оп- надо сделать — это вьшслить для ВТКП'(О большее зна- сти от того, насколько полноценно их программное ределсния функции.
Он будет передан агкс и агйт из ченис, чем то, которое хранится синтаксическим ана- обеспечение эмуляции терминала, могут заменять функции пш(пО вместе с указателем на структуру АКО. лизатором, для размещения символа конца строки. Во- "сьаг%5[%в];'хп" на "сьаг%5??(%ц??);хп". Как только станет известно, что имеются обязательные вторых, указанное значение содержится в переменной гргьпст(опгБггеаа, (пг Иг(оетуреде((ГЬЬЕ Опевегеав, ОЬЫБт вагдЫвс) (пс Оегагдв(ьпе агдс, ( сЬаг *вагди, АВО *егер)хп ): Ааооивит *А 1; (ргьпет(опгвггеаа, ((п"); (рггпет(опсвггеав, гпг ть1вагд;зп ); (рг1пет(оп15егеаа, гуредет вЬгпсг 5561п(1п'); (рг(пег(опеэгге 1пг соврагд (п ) тргьпет(опСБггеав, (п ); яЬьье(АгдЫвг) Грг(пет(опеэггеав, 1((агдс <= ад)1п , СоарАгда); грг(пет(онсвсгеав, (1п ); Агд = ОЬОесваса(дгдЫвс, ВОЬЬ, БОЬЬ)г Грггпгт(опгвегеав, ' гесагп -1;1п )г трг(пет(опгвггеав, )1п ); Грг1пьт(опевегеав, ")Г грг(пег(опевггеаа, ' и(агдс > вд) (п , соврагдв + Ореагдв + 1); Гргзпс((Опевегеаа, (1п ); аргументы СошрАгйя необязательные аргументы Ор(Агй, несложно будет сгенерировать код для определения того, достаточно ли аргументов и не слишком ли их много.
Рассмотрев в первую очередь эти вопросы, мы можем сконцентрироваться на более глубоких задачах проверки самих аргументов. 5еаге = ОЬОаст1гае [Агдогае) д]илсззнюлееьные тслитинесниераздезы Ссзздансзе лрасраыинесс инструиентин.ныз средсте Часть (й Глава 20 Поскольку неопознанные аргументы будут обраба- (рг(пе((опевегеав, (ргзпе1(оосвегеав, ая )зп 'аа (1(впз]рсг 1пдепс)] тываться с помошью е]зс, имеет смысл использовать син- ая (уп 1пиепе)з агди[ТЬ(авгд])уп', таксис конструкшзи ][.../ е]яе зГ.../ е[зе ([.../ е[яе, с кото1пдепе)] ++Тбтасоврвгд] рой легко производить итерации. Даже при отсутствии В этой главе лзы уже обсуждали лозкнос с первого ) опрслслснного по умолчанию условия, это, скорее все- взгляда открытие фигурной скобки.