|
Программирование >> Формирование пользовательского контейнера
if(token != : ) throw SyntaxExc( : expected in cases. ) ; Генерирует стопочные case-операторы, fout case start :\n ; for(int i = start+1 ; i <= end; i++) { fout indent case i : ; if(i != end) fout endl; Хотя функция содержит большой объем кода, она описывает действительно простой вариант трансляции. Напомню, что оператор cases позволяет вам задать диапазон значений, удовлетворяющих условному выражению оператора switch. Транслятор просто преобразует этот диапазон в набор стопочных case-операторов. Например, следующий оператор switch: switch (val) { cases О to 3: cout val is 0, 1, 2, or 3\n ; break; case 4: cout val is 4\n ; Транслируется в приведенный далее эквивалентный код на языке С++. switch (val) { case 0: case 1: case 2: case 3 : cout val is 0, 1, 2. or 3\n break; case 4 : cout val is 4\n ; K видите, создаются отдельные case-операторы для каждого значения из Диапазона, заданного в операторе cases. кция cases о действует следующим образом. Сначала считывается на-ьное значение диапазона. Оно может быть целым или символьной кон-Нтой. Если это целое число, то оно начинается с цифры. Если же это символьная константа, то она начинается с апострофа. В любом случае полученное значение запоминается в целочисленной переменной start. Далее читается лексема to и отбрасывается. Потом считывается конечное значение диапазона. Оно также может быть целым числом или символьной константой. Считанное значение запоминается в целочисленной переменной end. В конце формируется серия case-операторов, по одному для каждого значения из диапазона. Трансляция оператора typeof Оператор typeof предлагает альтернативную синтаксическую конструкцию для сравнения двух типов данных. Ее обычная форма записи приведена далее, typeof opl same as op2 Обозначения opi и op2 можно заменить идентификаторами типов (такими как int или MyClass) ИЛИ именами объектов. Таким образом, оператор typeof можно использовать для сравнения типов двух объектов, типа объекта и известного типа данных или двух типов данных. Результат выполнения оператора равен true, если типы одинаковы, и false в противном случае. Оператор typeof преобразуется в выражение на языке С++, в котором сравниваются результаты применения оператора typeid к каждому операнду. Трансляция оператора typeof выполняется функцией typeof о, приведенной далее. Транслирует оператор typeof. void typeofО { string token; string tenp; fout typeidC; skipspaces(); gettoken(token); do { tenp = token; if{Igettoken(token)) throw SyntaxExc { Шеэфес ted EOF encountered. ); if(token != same ) fout temp; } while{token != same ); Трансляция цикла repeat/until K уже упоминалось ранее, транслятор обрабатывает цикл repeat/until главным образом для иллюстрации, несмотря на то, что проще использовать **акрос, чем преобразовывать эту конструкцию. Тем не менее, имея трансля-> способный преобразовать этот тип цикла, мы избавлены от необходи-ости описывать макросы repeat и until во всех профаммах, использую-их. Кроме того, предложенная трансляция служит моделью, которую о*но адаптировать для других типов цикла. SkipspacesO; gettoken(token); if (token != as ) throw SyntaxExc( as expected. ); fout ) == typeidC; skipspaces О ; do { if(!gettoken(token)) throw SyntaxExc( Unexpected EOF encountered. ); fout token; ) while(token != ) ); fout ) ; Следить за действиями функции typeof () очень легко. Она считывает первый операнд и записывает в выходной файл оператор typeid, примененный к этому операнду. Далее функция читает и отбрасывает ключевые слова same и as. Затем считывается второй операнд и записывается оператор typeid, примененный к этому операнду. Таким образом, оператор typeof (): if (typeof obj same as Myciass) cout obj is a MyClass object.\n ; транслируется в следующий код на языке С++: if (typeid(obj) == typeid(Myciass)) cout obj is a MyClass object.\n ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |