Г. Шилдт - Полный справочник по C++ (1109478), страница 142
Текст из файла (страница 142)
Программа предлагает пользователю ввести строку, и, если слово солержится в словаре, на экран выводится список синонимов. Эта программа весьма проста, но следует заметить, что ее ясность и прозрачность являются результатол( применения класса ве.туре. (Определение класса веттуре содержится в заголовочном файле вти.и.) Часть )(. Приложения на языке С++ №1пс1иг)е "вст.й" №1пс1из)е <1овттеав> ив1пд павеврасе втб; ягттуре сйеваптив()[2) = ( "Ьоох", йуо1пве, Сове", "весте", "вегсйвпт, вйор, иагейопве", "рз.вто1", "дип, йапс)дип, 11геатв", "тип", "Зод, тгот, тасе", "Сй1п)г", "виве, соптевр1ате, ге№1ест", "соврите", "апа1уте, юотх опс, во1ззе" 1пт ва1п() ( дохтуре хз соис « >введите слово: с1п » хз 1пт 1," Еот(з.=сз Гйеваитпв[1)[0)!=""з з++) 11(тйеваптпв[1)[0)=.=х) сост « тйеваптив[г)[1)з гетптп 0; ) В следузошем примере с помошыо объектов класса вегтуре по заданному имени проверяется, сушествует ли выполняемый модуль программы.
Для этого достаточно ввести в комазшной строке имя файла без расширения. Затем программа повторно пытается найти выполняемый модуль, добавив к его имени расширение, и сообшает результат поиска. (Если файла нет, его невозможно открыть.) После проверки очередное расширение вычитается из имени файла, и вместо него подставляется новое. Ясность и простота этого примера, как и в предьщчпем случае, обеспечивается классом дохтуре. №1пс1пг)е "вгт.й" №1пс1иг)е <товстевв> №1пс1пс)е <твттевв> ив1пд павеврасе вез(з // Расширения выполняемых файлов. айат его[3)[4) = ( "БХЯ", "сон", "ВАт" )з 1пт ва1п(зпг агдс, сйат *атдзз[)) ( ВетТуре №павез з.пг 1з 11(атдс.'=2) ( сонг « "Командная строка: епаве1п"з гетитп 1з ) Глава 39. Интеграция новых классов: пользовательскни класс для работы со строками 749 тпаща = атди[1) тпаше = глаше + "."; // добавляем точку.
Тот(т=с; 1<3; 1++) ( глаше †. 1паще + яхт[1)/ // добавляем расширение. спит « "Проверка " « Кваше « 1твстааш т(йпаше); 1В(т) саит « "- Существуат1п"; т.с1ове()/ ) е1ве спит « "- Не существует1п"; Епаще = глаше — ахс[1); // Вычитаем расширение. ) таситп 0; ) Например, если программа называется хвехес, и существует файл тет.ехх, командная строка хвехес тевт выводит на экран следующие строки. Проверка ТЕЯТ.ЕХŠ— Существует Проверка ТЕБТ.СОМ - Не существует Проверка ТЕЯТ.ВАТ вЂ” Не существует Следует заметить, что в этой программе конструктор 1явставщ использует объект класса веттура. Это возможно, поскольку в этом случае автоматически вызывается функция преобразования в тип с)гат *.
Как видим, осторожное применение возможностей языка С++ вознаграждается полной совместимостью стандартных типов и типов, разработанных пользователем. Н Принципы создания и интеграции новых типов Как демонстрирует класс яеттура, создавать и интегрировать новые типы в среду программирования довольно просто. Для этого нужно выполнить следуюшие действия. 1. Перегрузить все подходящие операторы, включая операции ввода-вывода. 2. Определить все подходящие функции преобразования. 3. Предусмотреть конструкторы, позволяющие легко создавать обьекты в разнообразных ситуациях.
Одним из основных преимушеств языка С++ является его расширяемость. Не следует пренебрегать такой возможностью. Проблема Сушествует одна весьма интересная проблема. Попробуйте реализовать класс аеттура, используя стандартную библиотеку. Иначе говоря, для хранения символов следует применить не строку, а контейнер. Вместо указателей и функций примените для работы со строками итераторы и алгоритмы. Часть )/. Приложения иа языке С++ ссмотря на то по стандарт языка С++ довольно обширен, некоторыс темы в нем нс Н рассмотрены.
В ланной главе мы изучим одну из них: аятоксичгский околиз выразкений. Программы синтаксического анализа используются лля вычисления алгебраических выражений, например (1Π— 8)~3. Они довольно полезны и применяются во многих приложенияк В то же время синтаксические анализаторы окружены ореолом таинственности. По разным причинам процедуры, использующиеся в процессе синтаксического разбора, остаются достоянием избранных. Действительно многие достаточно умудренные опытом программисты пасуют перел процессом синтаксического анализа выражений. На самом леле синтаксический анализ выражений — весьма простая процедура.
Во многих отношениях она гораздо проще других задач, возникающих перед программистами, Ес простота является следствием строгих правил алгебры. В этой ~лаве мы рассмотрим программу рекурсивного нггсходяогего окализо (гесцгз)зе-дезссп1 рагзсг) и все вспомогательные процедуры, позволяющие вычислять арифметические выражения. Мы разработаем три версии программы синтаксического анализа выражений.
Первые две версии являются обычными, а третья — обобщенной. Ее можно применять к любым числовым типам. Однако перед тем как приступить к разработке синтаксического анализатора, необходимо сделать краткий обзор выражений и правил их грамматического разбора. Выражения Поскольку программа синтаксического разбора вычисляет алгебраические выражения, необходимо ясно представлять себе, из каких частей состоят выражения. Хотя в принципе выражения могут содержать самую разнообразную информацию, в рамках этой главы нас будут интересовать исключительно арифметические выражения. Для наших целей мы рассмотрим выражения, состоящие из следующих компонентов. ° Числа ° Операции ч —, /, ь, ", зги = ° Скобки ь Переменныс В нашем синтаксическом анализаторе символ " будет означать возведение в степень (а не логическую операцию исключающего "ИЛИ", как обычно).
Символ = обозначает оператор присваивания. Перечисленные выше компоненты объединяются в выражения в соответствии с правилами алгебры. Приведем некоторые примеры. 10 — в (100-5)*14!б а+Ь-с 1О"5 а=10 — Ь Установим следующие приоритеты опера~оров. + — (унврныв) высший / Ъ + низший Операторы, имеющие одинаковый приоритет, вычисляются слева направо. лг Часть Ч. Приложения на языке С++ В примсрах, рассмотрснных по холу изложения, все переменные обозна«а>атся одной буквой (иначс говоря, допускается использование лишь 2б псрсмснных, соответствующих буквам от л до в).
Стра шыс и прописные буквы нс различаются (буквы а и л считаются одинаковыми). В первой версии ан>шизатора всс чнсловыс псрсмснныс приводятся к типу >ЗоаЬ1е, хотя читатсли легко смогут модифицировать эту про>.рамму, настроив сс на обработку л>абого другого числового типа. Кроме того, для упрощения логики программы в цсс включены минимальные срсдства проверки ошибок. ~ Синтаксический анализ выражений: постановка задачи На псрвый взгляд, синтаксический анализ выражений кажется довольно простой задачсй. Однако, чтобы лучше понять ес, попробуйте-ка вычислить выраженно $ !0-2*3 Как известно, результат этого выражения равен 4. Несмотря на то что создать программу, вычисляющую это ирифмети«еское выражение, довольно легко.
возникает вопрос, как создать программу, вычисляю>цую правильный результат лриизнильниги выражения. В качсствс первого варианта можно написать следующую программу. а = первый операял >«Ы! с(ес>ь операнды) ор = оператор Ь = второй операнд а=аарЬ Эта программа получаст первый операнд, оператор и второй операнд, а затем выполняет первую операцию, получает следующий оператор и его операнды и тш. Олнако, если этот подход положить в основу вссй программы, то разультатом выражения )0 — 2*3 будет число 24 (т.с. 8«3), а нс 4, поскольку эта процедура игнорируст приоритет операторов. Нсльзя просто перебирать операторы и операнды слова направо, поскольку в соответствии с правилами алгебры умножение имеет более высокий приоритет, чем вычитание. Начинающие программисты часто полагают, что это ограничение легко прсолалсть, и иногда, правда, в очснь редких случаях, им эта удастся.
Однако, если учесть скобки, возведение в степень, псрсмснныс, унарныс операторы и тому подобное, задача становится намного сложнсс. Нссмотря на го что сушсствусг насколько способов создания программы, вычисляющей выражения, мы рассмотрим лишь наибалсс простой и понятный. Кстати, имснно поэтому он чаше всего примснястся. Этот метод называется рекурсивным нисходящим анализам. По мере чтения главы читатели поймут, почсму он получил такое название. (Иногда при разработке синтаксичсских анализаторов применяются другис методы, основанные на сложных таблицах, которые должны генерироваться другими программами.
Иногда такис программы называют >нибличными синтаксическими анализаторами (гаЫс-дп«сп раггсг).) Синтаксический анализ выражения Сущсствуст много способов си>паксичсского анализа и вычислсния выражений. В рамках рекурсивного нисходящего анализа выражения рассматриваются как ре- Глава 40. Синтаксический анализ выражений хурсивные опрукгпуры данных (тесцгйуе дага мгцс(огсз). Если бы выражения могли состоять лишь из операций +, —. *, У и скобок, то все выражения можно было бы определить по следующим правилам.