|
Программирование >> Формирование пользовательского контейнера
Ключевое слово 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 ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |