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

1 ... 115 116 117 [ 118 ] 119 120 121 ... 156


360 Гпавад

терпретатора всего языка С++. Предлагаемый интерпретатор Mini С++ понимает очень узкое подмножество языка, но оно включает в себя большинство наиболее важных элементов С++. Например, интерпретатор Mini С+-ь поддерживает рекурсивные функции, глобальные и локальные переменные вложенные области видимости (nested scope) и большинство управляющих операторов. Далее приведен перечень всех поддерживаемых интерпретатором элементов языка:

□ параметризованные функции с локальными переменными;

□ вложенные области видимости;

□ рекурсия;

□ оператор if;

□ оператор switch;

□ циклы do-while, while И for;

□ оператор break;

□ локальные и глобальные переменные типов int и char;

□ параметры функций типов int и char;

□ целые и символьные константы;

□ константы типа string (ограниченная реализация);

□ группа стандартных библиотечных функций;

□ оператор return со значением и без;

□ операции: +, -,*, /, %, <, >, <=, >=, ==, !=, ++, -, унарный - и унарный +;

□ функции, возвращающие целые значения;

□ знаки комментариев: /* и ;

□ консольный ввод/вывод с помощью операторов cin и cout.

Несмотря на то, что приведенный перечень может показаться коротким, он потребует для реализации внушительного объема кода. Приходится платить существенную входную плату за интерпретацию такого языка, как С++ Хотя перечисленные элементы описывают лишь его небольшую часть, они позволяют интерпретатору обрабатывать ядро языка, включая его базовый синтаксис, управляющие операторы, выражения и средства вызова функций. Таким образом. Mini С++ интерпретирует то, что можно назвать основной сутью языка С++.

Как вы, несомненно, заметили, интерпретатор Mini С++ не поддерживает тип class. Причина этого чисто практическая. Поддержка типа class означала бы, что интерпретатор также обрабатывает определенные пользователем типы, реализацию объектов (object instantiation), и операцию-точку (dot (.) operator). Более того, тип class требует, чтобы интерпргтатор понимал назначение спецификаторов public и private. Несмотря на то, что ин-



терпретатору несложно обрабатывать каждый из этих элементов, все вместе они приведут к разрастанию кода интерпретатора до объема, который невозможно представить в одной главе данной книги. После того как вы поймете, как действует интерпретатор, возможно, у вас появится желание самостоятельно добавить поддержку типа class.

К другим элементам языка, не обрабатываемым интерпретатором, относятся перегрузка функций и операций, шаблоны, пространства имен, исключения, препроцессор, структуры, объединения и битовые поля. Опять-таки, интерпретировать их не сложно, но код интерпретатора вырастет до размеров, неприемлемых для книги подобного формата. Включение обработки этих элементов может стать интересным проектом для вашей самостоятельной работы.

Некоторые ограничения Mini С++

Даже при реализации поддержки относительно небольшого набора элементов объем кода интерпретатора Mini С++ все же довольно большой. Для того чтобы препятствовать его дальнейшему разрастанию, на фамматику С++ накладывается несколько офаничений. Во-первых, формирующие результат операторы (targets) в составе управляющих операторов if, while, do и for должны быть блоками кода, заключенными в фигурные скобки. На их месте нельзя использовать одиночный оператор. Например, Mini С++ некорректно интерпретирует код, приведенный далее.

for (а = 0; а < 10; а++) for (b = 0; b < 10; b++) for (с = 0; с < 10; С++) cout hi ;

if (...)

if(...) x = 10;

Вместо приведенного кода следует написать следующий:

for (а = 0; а < 10; а++) { for (b = 0; b < 10; b++) { for (с = 0; с < 10; С++) { cout hi ;

if (...) ( if(...) {



x = 10;;

Это ограничение облегчает интерпретатору поиск конца фрагмента кода, (юрмируюшего результат перечисленных управляющих операторов профаммы. Но поскольку эти части управляющих операторов часто представляют собой так или иначе блоки кода, это ограничение не кажется слишком жестким (приложив немного усилий, вы сможете снять это офаничение, если захотите).

Второе Офаничение - отсутствие поддержки прототипов. Предполагается, что все функции возвращают тип int (можно возвращать тип char, но он преобразуется в тип int), и не выполняется никакой проверки типов параметров. Более того, поскольку перегрузка функций не поддерживается, допустим один, и только один, вариант функции.

Оператор switch поддерживается полностью, за исключением обработки метки default. Это ограничение введено для уменьшения размера и сложности кода, необходимого для интерпретации оператора switch (это наиболее сложный оператор для интерпретации). Вставка обработки метки default - еще одно задание для самостоятельной работы.

И наконец, всем именам функций в объявлении должны предшествовать спецификаторы типа int или char. Следовательно, обработка типа void в интерпретаторе Mini С++ не предусмотрена. Таким образом, правильным считается следующее объявление функции.

Int f()

...

Приведенное далее объявление не корректно.

void f()

...

Неформальная теория С++

Для того чтобы лучше понять действия интерпретатора Mini С++, необходимо узнать, как сфуктурирован язык С++. Если вы когда-нибудь видели формализованное описание языка С++ (например, то, которое можно найти в стандарте С++, разработанном ANSI/ISO (Американская и международная организации стандартизации)), то знаете, что оно очень длинное и напол-



1 ... 115 116 117 [ 118 ] 119 120 121 ... 156

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