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

1 ... 57 58 59 [ 60 ] 61 62 63 ... 156


Ключевое слово repeat транслируется приведенной далее функцией repeat (), которая просто заменяет его ключевым словом do: Транслирует repeat, void repeat О { fout do ;

Ключевое слово until обрабатывается функцией until о, код которой приведен далее Транслирует untfil. void until О {

string token;

int parencount = 1;

fout while ; skipspaces();

Читает и запоминает ( gettoken(token); if(token != ( )

throw SyntaxExc( ( expected in typeof . ); fout ( ;

Начинает цикл while, заменяя на противоположное и заключая в скобки условное вьфажение. fout !( ;

Теперь читает выражение, do {

i f(!gettoken(token))

throw SyntaxExc( Unexpected EOF encountered, );

if(token == ( ) parencount++; i f(token == ) ) parencount-;

fout token; } while(parencount > 0); fout ) ;



функция until О подставляет ключевое слово while вместо until и меняет условие выполнения на противоположное (напоминаю, цикл repeat/until рыполняется до тех пор, пока условие не станет равно true, а цикл jo/whiie - пока условие не будет равно false).

Хотя концептуально это выглядит просто, разработка кода, меняющего условие на противоположное, требует усилий. Причина состоит в том, что транслятор не может просто добавить операцию ! в начало выражения. Он должен сначала заключить в скобки выражение, перед которым следует по-(яавить !. Для иллюстрации рассмотрим следующий цикл repeat/until:

int i=0; repeat {

cout i ;

i++;

) until (i==10) ;

Oh транслируется в приведенный далее цикл do/while:

int 1=0; do {

cout i << ; i++;

} while(!(i==10)) ;

Скобки в условном выражении для while гарантируют, что цикл будет выполняться до тех пор, пока переменная i не равна ю. Если же скобки удалить, как показано далее: } while(!i==10) ;

ЦИКЛ будет продолжаться пока выражение ! i равно ю, а это совсем другое условие!

Для заключения в скобки выражения для until транслятор должен добавить открывающуюся скобку в начало выражения и закрывающуюся - в конец. Но как транслятор определит конец условного выражения? Ответ - подсчетом пар скобок. Напоминаю, что выражение Для until заключено в скобки. Число встретившихся скобок хранится в переменной parencount, начальное значение которой равно I (что соответствует открывающейся скобке выражения для until). Во время копирования условного выражения транслятор Уличивает на единицу значение переменной parencount каждый раз, когда етилась открывающаяся скобка, и уменьшает его на 1 при обнаружении Скрывающейся скобки. Таким образом, когда переменная parencount ста-равна О, достигнут конец выражения и можно добавить последнюю заигрывающуюся скобку.



Демонстрационная программа

профамма, приведенная в листинге 4.4, позволяет проверить все экспериментальные конструкции языка, поддерживаемые транслятором.

I Листинг 4.4. Программа, содержащая экспериментальные конструкции для С+Г:

Демонстрирует все экспериментальные конструкции, обрабатываемые транслятором. #include <iostreain> using namespace std;

Создает полиморфный базовый класс.

class А {

public:

virtual void f() { } ;

И конкретный подкласс(concrete subclass).

class В: public A {

public:

void f0 [}

int mainO {

int n[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; double dn[] = {1.1, 2.2, 3.3, 4.4 }; cout Using a foreach loop.Xn ;

/* Ключевые слова, такие как foreach или typeof, игнорируются внутри комментариев или строк, заключенных в кавычки. */

Цикл foreach.

foreach(int х in n ) cout X ;

cout XnXn ;

cout Using nested foreach loops.\n ;



1 ... 57 58 59 [ 60 ] 61 62 63 ... 156

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