Программирование >>  Формирование пользовательского контейнера 

1 ... 46 47 48 [ 49 ] 50 51 52 ... 156


Примечание

Если вас интересует синтаксический анализатор для С++, обратитесь к главе 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чны в программировании. Они выглядят громоздкими. Было бы гораздо Удобнее задавать диапазон значений в одном операторе. Именно это и позволяет вам сделать транслятор.



1 ... 46 47 48 [ 49 ] 50 51 52 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика