|
Программирование >> Формирование пользовательского контейнера
Примечание Если вас интересует синтаксический анализатор для С++, обратитесь к главе 9. Экспериментальные ключевые слова Перед тем как разрабатывать транслятор, следует определить, какие преобразования он будет выполнять. Транслятор, предлагаемый в этой главе, поддерживает следующие экспериментальные расширения для языка С++: О цикл foreach; О оператор cases; О оператор cypeof; цикл repeat/until. исключением цикла repeat/until, включенного в список просто для иллюстрации, остальные ключевые слова используют синтаксис, который трудно (или невозможно) преобразовать с помошью макроподстановок. ° Последующих разделах описывается каждое из перечисленных ключевых слов. лзыка С++. Вы можете создать транслятор, который обеспечит преобразо-рание под контролем программы экспериментальных конструкций в эквивалентный им код на языке С++. Использование подобного пре-препроцессора позволит вам добавить такие новые функциональные возможности в язык С++, которые трудно или невозможно реализовать с помощью макросов для препроцессора. Предлагаемый транслятор интересен и сам по себе, а его основной каркас легко адаптировать для других целей. Следует отметить, что хотя разрабатываемый в этой главе транслятор способен выполнять сложные текстовые подстановки, он не лишен ограничений. Поскольку транслятор реализует однопроходный алгоритм, читающий исходный файл один раз, он может применяться для экспериментирования только с теми языковыми средствами, которые можно обработать с помошью однопроходной подстановки (при желании вы можете изменить поведение транслятора). Помимо замещений сложного текста, транслятор находится в полном неведении относительно содержания программы. Он ничего не знает о типе переменной, о смысле операции и даже прочитанной ранее лексемы. Таким образом, предлагаемый транслятор не является синтаксическим анализатором языка С++. Это просто механизм или средство для специализированных текстовых подстановок; по существу, его можно назвать специализированным препроцессором. Несмотря на перечисленные ограничения, вы можете использовать этот транслятор для проверки разнообразных идей. Цикл foreach Современные разработки языка программирования включают в язык этот цикл. Например, цикл foreach - часть языка С#, цикл вида for each до, бавлен в язык Java. Более того, принцип for each включен в один из новейших разделов С++, так как в библиотеке STL (Standard Template Library, Стандартная библиотека шаблонов) определен алгоритм for each(), который применяет функцию к каждому элементу в контейнере. Однако в языке С++ до сих пор не определен цикл foreach обшего назначения. Этот цикл был придуман для обработки ситуации, довольно часто возникающей в программировании, а именно - для обработки в цикле элементов массива (или другой разновидности коллекции объектов) в строгой последовательности от начала к концу. Рассмотрим пример, в котором вычисляется среднее арифметическое элементов массива. int п[] = {1, 7, 3, 11, 5}; double avg = 0.0; for(int i=0; I < 5; i++) avg += n[i]; cout Average: avg/5 endl; Для вычисления среднего арифметического массива п считывается каждый элемент от начального до конечного. Конечно, это только один пример, иллюстрирующий основную идею. Такой же тип цикла применяется для поиска максимального и минимального значений в массиве, суммирования элементов массива, вычисления наименьшего общего знаменателя и для сотни других задач. Более того, цикл подобной конструкции применяется везде, где необходим доступ к содержимому массива. Цикл foreach создан для упрощения и рационализации подобных вычислений. Заслуга цикла foreach состоит в том, что он исключает необходимость индексирования массива вручную. Вместо этого цикл foreach автоматически обрабатывает целый массив, последовательно получая каждый элемент. Далее показан приводившийся ранее фрагмент, но с применением цикла foreach. int n[] = {1, 7, 3, 11, 5};. double avg=0.0; foreach(int x in n) avg += x; cout Average: avg/5 endl; риант перевода этажерочный тоже подходит. - Пер. g каждом новом проходе цикла переменной х автоматически присваивается значение следующего элемента массива. Таким образом, в первом проходе х одержит 1, во втором - 7 и т. д. Этот цикл не только предлагает усовершенствованный синтаксис, но и препятствует возникновению ошибок вычисления. Далее приведена синтаксическая запись для цикла foreach. foreach (t3<pe vamame in arrayname) Здесь type - это тип переменной цикла, ее имя задается параметром varname, а массив, который будет обрабатываться, определяется параметром гаупате. Переменная varпaлle - локальная переменная, и она не известна за пределами цикла (этот синтаксис позаимствован у языка С#). Помните, при каждом проходе цикла varname содержит значение следующего элемента (строго в порядке следования) заданного массива. Транслятор преобразует цикл foreach в эквивалент языка С++ - цикл for. Оператор cases Оператор cases позволяет задать ряд значений, которые будут соответствовать switch-выражению. Обычно, если вы хотите, чтобы один и тот же фрагмент кода использовался двумя или несколькими .case-операторами, следует применять стопочные (stacked) case-операторы, как показано в следующем примере, switch(i) { case 1: case 2: case 3: case 4: делать что-нибудь для case-операторов от 1 до 4 break; case 5: делать что-нибудь еще break; ... Стопочные case-операторы, такие как 1-4 в приведенном фрагменте кода, Ь1чны в программировании. Они выглядят громоздкими. Было бы гораздо Удобнее задавать диапазон значений в одном операторе. Именно это и позволяет вам сделать транслятор.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |