Некоторые ограничения 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(...) { х = 10;; Это ограничение облегчает интерпретатору поиск конца фрагмента кода формирующего результат перечисленных управляющих операторов программы. Но поскольку эти части управляющих операторов часто представляют собой так или иначе блоки кода, это ограничение не кажется слишком жестким (приложив немного усилий, вы сможете снять это ограничение, если захотите). Второе ограничение — отсутствие поддержки прототипов. Предполагается, что все функции возвращают тип int (можно возвращать тип char, но он преобразуется в тип int), и не выполняется никакой проверки типов параметров. Более того, поскольку перегрузка функций не поддерживается, допустим один, и только один, вариант функции. Оператор switch поддерживается полностью, за исключением обработки метки default. Это ограничение введено для уменьшения размера и сложности кода, необходимого для интерпретации оператора switch (это наиболее сложный оператор для интерпретации). Вставка обработки метки default — еще одно задание для самостоятельной работы. И наконец, всем именам функций в объявлении должны предшествовать спецификаторы типа int или char. Следовательно, обработка типа void в интерпретаторе Mini С++ не предусмотрена. Таким образом, правильным считается следующее объявление функции. Int f() { //... } Приведенное далее объявление не корректно. void f() { //... }
|