Главная » Просмотр файлов » Г. Шилдт - Полный справочник по C++

Г. Шилдт - Полный справочник по C++ (1109478), страница 144

Файл №1109478 Г. Шилдт - Полный справочник по C++ (Г. Шилдт - Полный справочник по C++) 144 страницаГ. Шилдт - Полный справочник по C++ (1109478) страница 1442019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 144)

ратяет::ратяет() ( ехр рет = Н()ВВ; ) // Отправная точка синтаксического анализа. ВоиЬ1е ратвет::еча1 ехр(спат *ехр) ( <(оиЬ1е теви1е; ехр рст = ехр; дес со)<еп(); 15(!*со]сеп) веттот(2); // Выражение пусто. Часть У. Приложения на языке С++ тесптп О.Ос ) еча1 ехр2(теви1с)с ай(*то)сеп) веттот(О); // Последней лексемой должен быть // нулевой символ.

техпхп теви1т; ) // Складываем или вычитаем два терма. ноас) рахветссеса1 ехр2ИопЬ1е ахевп1т) тедавсет онат ор; с)опЬ1е сеспрс еча1 ехрЗ(тевп1с)с ии41е((ор = "то)сеп) == '+' ~) ор == '-') ( дев со)сеп(); еча1 ехрЗ(таир)т виатсЬ(ор) ( саве тевп1т = тевп1т - сньрс Ьхеа)с; саве '+'с тевп1т = тевп1т + сешрс Ьтеа)сс // умножаем или делим два фактора. ноас) ратветссеча1 ехрЗ(с)опЬ1е атевп1х) тедавгет сиах орс с)оиЬ1е хемрс ена1 ехр4(тевп1с)с иЫ 1е((ор = *со)сеп) == '*' ~! ор == '/' ~~ ор == 'в') дев ко)сеп()с еча1 ехр4(тетпр); ви1тсЬ(ор) ( саве '*'с теви1с = тевп1т * темр; Ьтеа)сс саве '/'с тевп1с = тевп1т / сесьр; Ьтеа)сс саве 'Ъ'с хевп1т = (апс) хевп1т Ъ (йпх) тевср; Ьтеа)сс ) ) ) // Возведение в степень ноас) ратветссеча1 ехр4ИопЬ1е атеви1т) ( с)очЬ1е г.емр, ехс Глава 40.

Синтаксический анализ выражений гедевсех Епс с; еча1 ехрб(хеви1х)) 15[*то)сеп--= ' '1 ( дег со)сеп(); еча1 ехр4(тевр)с ех = теви1Ы 15(тевр==0.0) ( теви1с = 1.0; хесигп; ) бог(с= [Епг) севр — 1; с>0с — с) геви1с =. геви1т " (с)оиЫе) ех; ) // Вычисление унарных операций + или — . чотс) рагвегссеча1 ехр5[с)оиЫе ахеви1г) ( хедувхег с)саг ор; ор = 0; 15[(со1с туре == Ве11Р)1теВ) ы. «со)сел=='+' !~ «со)сеп == ' †'1 ( ор = «со)сепс дес. со)сеп()с 1 еча1 ехрб(геви1с)с Н [ор=='-') хеви1с = -хеви1сс ) // Распознавание скобок.

чорс) рагвегс:еча1 ехрб(с)оиЫе ахеви1с) ( 11((«со)сеп == ' (') ) ( дев со)сеп() с еча1 ехр2 (геви1с! ) 15(«хо)сеп 1= ') ') яеххох(1)) дев Со)сеп() ) ) е1ве асов(хеви1г)) ) // Получает число. чоес) рагвегс:асов[с)оиЬ1е ахеви1с) виухс)с[со)с суре) ( саве )ЛЛЯВЕВс геви1с = асоХ(то)сеп)с дег со)сеп(); гесихпс с)ебаи1хс ветгог(01) ) // Выводит сообщение о синтаксической ошибке. чоЫ рагвег::вегхог(1пе ехгог) всасас снах *е<)= [ 'Синтаксическая ошибка", "Нарушен баланс скобок", "Выражение пусто" соне « е(егхог) « епг)1; ) // Извлекает следующую лексему. чохг) рагвех::дее еоиеп() < гедавсег с)тах *хешр; Еоя Суре = 0; еешр = еохеп; * Еешр = ' 10 ' ( ВГ(!*ехр рех) хехцхп; // В конце выражения. ии11е(авврасе(*ехр ргг)) +техр рех; // Пропуск разделителя.

3 Г(вехснх(" ~ — "/Ъ =(), "ехр рсх) ) ( Сои Суре = ВЕЬтиттЕП( // Переход на следующий символ. *гепр++ = *ехр рхх++; ) е1ве ВГ([ва1рна(*ехр рсх) ) иЫ1е(!Ввг)е11ш("ехр ртх)) *Еешр+~ = *ехр рог+.~; СОК Суре = (/АР1АВЬЕ; ) е1ве ах(ав((101Е(*ехр рхг) ) ( ип11е(![вг)е11ш(*ехр рог)) *хешри = *ехр регат; сои Туре = НВНВЕРи ) *секр = ' 10 '; ) // Если параметр с является разлелителем, // возвращает значение Ехце. хпе рагвех::авг)е11ш(сиах с) < ВГ(всгс)п(" +-/*а"=() ", с) ) ) с/=д ) ) с=='1х' ) ) с==0) гегцхп 1; геецхп 0; ) Эта программа синтаксического анализа может выполнять операции +, —,, / и ж Кроме того.

она может возводить число в целую степень и выполнять унарную операцию -. Программа синтаксического анализа правильно вычисляет баланс скобок. Фактическое вычисление выражения осуществляется взаимно рекурсивными функциями еча1 ехрз() — ееа1 ехрб(), а также функцией аееав[), возвращающей извлеченное число.

Предназначение каждой функции описано в комментариях. Продемонстрируем применение этой программы. Глава 40. Синтаксический анализ выражений 1пс таьп() ( оиаг ехрвгг[00); соос « "ддя окончания работы введите точку. [п"; рагвег оЬ: // Оседание анализатора. гог(;~) соос « "Введите выражение: с[п.дес11пе(ехрвсг, 79); 1г(*ехрвсг=='.') Ьгеак; сонг « "Ответ". " « оЬ.еъа1 ехр<ехрвег) « "1п1п": ); гесчгп 0; Вот какие результаты можно получить с помощью этой программы.

Для окончания работы введите точку. Введите выражение: 10-2*3 Ответ: 4 Введите выражение: (10-2!*3 Ответ: 24 Введите выражение: 10/3 Отв : З.ЗЗЗЗЗ Введите выражение: Принципы работы синтаксического анализатора Чтобы понять, как работает синтаксический анализатор, применим его к выражению И [0-3*2 При вызове функция ежа1 ежр(), представляющая собой отправную точку анализа, извлекает из выражения первую лексему. Если она является нулем, функция выводит на экран сообщение "вырывание пусто" и возвращает управление вызывающему модулю. Однако в данном случае лексема содержит число 10. Поскольку первая лексема не равна нулю, вызывается функция ежа).

ежрз(). В результате функция ежа1 ежрз() вызывает функцию ежа1 ежрз(), а функция ежа1 ежрз()вызывает функцию еча1 ежр4(), которая, в свою очередь, вызывает функцию еча1 ежрв [) . Затем функция ежа1 ежрв [) проверяет. является ли лексема унарным плюсом или минусом, и, если нет, вызывает функцию ежа1 евра(). В этой точке программы функция еъа1 ежрв<) ЛИбо рекурсивно вызывает функцию еча1 ежрз [) (если выражение содержит скобки), либо вызывает функцию асом(), возвращающую число.

Поскольку лексема не является открывающей скобкой, выполняется функция асом() „и переменной гееезс присваивается число 1о. Затем из выражения извлекается следующая лексема, и функции возвращают управление по цепочке. Поскольку следующая лексема содержит знак —, управление передается функции ежа1 ехр2 (). Затем наступает очень важный момент. Поскольку лексема содержит знак -, он записывается в переменную ор. Затем анализатор извлекает следующую лексему, рав- 762 Часть У. Приложению иа языке С++ ную числу 3, и вновь начинается нисходящий анализ по цепочке.

Сначала, как и прежде, вызывается функция асса(), которая возвращает число 3. Затем это число присваивается переменной теап1е, после чего считывается лексема . После этого управление возвращается по цепочке в функцию е га1 егхдз (), которая считывает последнюю лексему, равную числу 2.

В этот момент выполняется первая арифметическая операция — умножение 2" з, Рсзульзат возвращается в функцию еча1 еир2(), в которой выполняется вычитание. Результатом вычитания является число 4. Хотя, на первый взгляд, процесс анализа выглядит довольно запутанным, его проверка на других примерах показывает, что все функции работают правильно.

На основе этого синтаксического анализатора можно создать простой калькулятор. Однако прежде чем внедрять этот калькулятор в более сложные программы, например, в базы данных, необходимо научить его работать с переменными. Этому посвящен слелуюший раздел. Синтаксический анаяизатор, работающий с переменными Все языки программирования, многие калькуляторы и электронные таблицы используют переменные длн хранения величин. Поскольку во всех этих приложениях применяешься синтаксический анализ выражений, необходимо научиться обрабатывать переменные. Для этого следует усовершенствовать наш синтаксический анализатор. Как указывалось выше, для обозначения переменных используются буквы ог й до в, Переменные будут храниться в массиве, принадлежащем классу ратеет. Следовательно„в класс ратвет необходимо включить новый член.

и ((ои)о1е иагз(нцнийнв]; // Хранит значения переменньис. Кроме того, придется изменить конструктор класса ратвет. // Конструктор класса сопзхгисхох ратзет::рагзег() ( ьпг. з. ~ екр рхт = нцьь| гох(1=0; 1<и(ЛЧуйпв; хн.) чаха[1] = 0.0; Как вилим, переменныс инициализируются нулем. Кроме того, нам поналобится функция, определяющая значение переменной. Поскольку псременныс называются буквами от й до и, их легко использовать в качестве индексов массива чати, вычитая из имен переменных АБСП-код буквы й. Эту операцию выполняет функция-член Ыгнт еат(). // Возвращает значение переменной. г]оиЬ1е рагзег::гзпг( чаг(сЬаг *з) зг(!1за1рпа(*з))( зеггот(1); гесигп 0.0; ) гесигп чаха(соиррег(*сохеп) †'й'); ) Глава 40.

Синтаксический анализ выражений Функция допускает ллинныс имена персменцых, но учитывает лишь их первый символ. с(итатели могут модифицировать ес по своему усмотрению. Кроме того, нам необходимо изменить функшно аеощ(), чтобы она могла обрабазывать ис только числа, но и переменныс. Вот как выглядит ее новая версия. '""':. ~/ Извлекает число или значение переменной. аг чо)с( расвег::аеощ(доиЬ1е Ьгевп1С) я) ( $ виьссЬ(со)с суре) я са.е )/ЛЛ)ЛВЕЕ: тезц1» = г1по ъат(сокеп); я пес сохеп(); лесцлп; саве БЦИВЕВ: левч1с = аоот(секес) пес соиеп(); тесоспг оетап1С: вел сот(0) г С технической точки зрения этих изменений вполне достаточно, чтобы выполнить синтаксический анализ выражений, содержаших переменные.

Олнако у нас еше нет функции, присваиваюшсй переменным их значения. Довольно часто эта операция выполняется за пределами синтаксического анализатора, однако мы создадим свои оператор присваивания и сделаем его частью класса рахвел. Это можно выполнить по-разному. Во-первых. можно добавить в класс рахвек функцию еча1 енр1(). Теперь цепочка рекурсивного нисходящего анализа булет начинаться с нее. Зто значит, что в начале синтаксического анализа должна вызываться функция еча1 енр1(), а пе функция еча1 емрз().

Рассмотрим определение функции еча1 еяр1(). $ // Присваивание. Ф' чоьб ралвег:: еча1 ехр1(аопЬ1е слевп1с) ~ ( )гС я1ое; спал Стой Суре; , Ьал Соыр сокеп(60) ).(сои суре==цддтЛВВЕ) // Сохраняем старую лексему. вс ору(сеир со)сеп, соиеп)г ссох суре = сох суре; // Вычисляем индекс переменной. з1ос = соцррег(*сохеп) - 'А'г Вее Со)сеп(); 1Е("ео)сеп != '=') ( рпсЬас):(); // Возвращаем текущую лексему // Восстанавливаем старую лексему // присваивание не выполняется.

Характеристики

Тип файла
DJVU-файл
Размер
7,03 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6552
Авторов
на СтудИзбе
299
Средний доход
с одного платного файла
Обучение Подробнее