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

1 ... 143 144 145 [ 146 ] 147 148 149 ... 156


prog++; переходит за ; в исходном коде temp2 = prog;

Ищет начало блока for. paren = 1; while(paren) { get token();

if(*token == () paren++; if(*token == ) ) paren-;

Подтверждает начгшо блока. get token(); if(*token !={)

throw InterpExc(BRACE EXPECTED); putbackO ;

Если условие true, интерпретирует if(cond) interpO ;

else { в противном случае переходит к концу блока find eob(); return;

prog = tenp2; переходит к инкрементному выражению

Шет оператор break в цикле, if(breakfound) {

Ищет начало блока в цикле.

do {

get token();

) while(*token != { && tok != END);

putbackO ; breakfound = false;

find eob(); теперь ищет конец цикла return;



Вычисляет инкрементное выражение. eval exp(cond);

prog = tenp; возвращается к началу цикла

Функция начинается с вычисления инициализирующего выражения в цикле for. Инициализирующая часть выполняется один раз и не входит в состав тела цикла. Далее указатель программы продвигается к позиции, следующей за точкой с запятой, завершающей инициализирующую часть цикла for и адрес этой позиции присваивается переменной temp. Это местоположение начала условного выражения. Далее выполняется вход в бесконечный цикл, который проверяет условное выражение цикла for и присваивает переменной temp2 адрес начала инкрементного выражения. Затем определяется начало кода цикла. Наконец, если условное выражение равно true, интерпретируется блок цикла. В противном случае находится конец блока цикла и продолжается выполнение части программы, следующей за циклом for. Предположим, что цикл выполняется, тогда после заверщения вызова функции interpO вычисляется инкрементное выражение и процесс повторяется. Конечно, процесс будет остановлен, если внутри блока цикла встретится оператор break.

Обработка операторов cin и cout

Поскольку ввод/вывод с помошью операторов cin и cout - фундаментальная составляющая языка С++, представляется естественной их поддержка в интерпретаторе Mini С++. Однако Mini С++ не обрабатывает ввод/вывод с помощью операторов cin и cout так, как это делает коммерческий компилятор. Как вы знаете, cin и cout - предопределенные идентификаторы, соответствующие потокам, связанным со стандартными вводом и выводом. Они используются для ввода информации с консоли и вывода ее на консоль с помощью операторов ввода/вывода и . Соответственно операторы и переопределены для ввода/вывода. Но в интерпретаторе Mini С++ не поддерживается перегрузка операторов. Для сохранения максимально возможной простоты интерпретатора в нем даже не поддерживаются операторы сдвига и (но функция get token узнает их)! Несмотря на эти ограничения интерпретировать операторы cin и cout все же довольно легко.

Консольный вывод с помощью оператора cout обрабатывается функций exec cout, приведенной далее.

Выполняет оператор cout. void exec cout()



int val; get tolcen();

if(*token != LS) throw InterpExc(SYNTAX);

do {

get token();

if(token type==STRING) { Выводит строку, cout token;

else if(tokentype == NUMBER

tokentype == IDENTIFIER) { Выводит число. putbackO; eval eзф(val); cout val;

else if(*token == \ ) {

выводит символьную константу. putbackO ; eval eзф(val); cout (char) val;

get token(); ) while(*token == LS);

if(*token != ;) throw InterpExc(SEMI EXPECTED);

Когда в коде обнаружен идентификатор cout, читается следующая лексема. Если она не , то выводится сообщение о синтаксической ошибке. В противном случае выполняется цикл, который получает и затем выводит строку или значение выражения, расположенные справа от комбинации символов . Этот процесс продолжается до тех пор, пока не будет достигнут коней оператора cout.



1 ... 143 144 145 [ 146 ] 147 148 149 ... 156

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