Обработка операторов с/л и cout |
Поскольку ввод/вывод с помощью операторов cin и cout — фундаментальная составляющая языка С++, представляется естественной их поддержка в интерпретаторе Mini С++. Однако Mini С++ не обрабатывает ввод/вывод с помощью операторов cin и cout так, как это делает коммерческий компилятор. Как вы знаете, cin и cout — предопределенные идентификаторы, соответствующие потокам, связанным со стандартными вводом и выводом. Они используются для ввода информации с консоли и вывода ее на консоль с помощью операторов ввода/вывода « и ». Соответственно операторы « и » переопределены для ввода/вывода. Но в интерпретаторе Mini С++ не поддерживается перегрузка операторов. Для сохранения максимально возможной простоты интерпретатора в нем даже не поддерживаются операторы сдвига « и » (но функция get_token узнает их)! Несмотря на эти ограничения интерпретировать операторы cin и cout все же довольно легко. Консольный вывод с помощью оператора cout обрабатывается функций exec_cout, приведенной далее. // Выполняет оператор cout. void exec_cout() { int val; get_token () ; i f(* token != LS) throw InterpExc(SYNTAX); do { get_token(); if(token_type==STRING) { // Выводит строку, cout « token; } else if(token_type == NUMBER || token_type == IDENTIFIER) { // Выводит число, putback(); eval_exp(val); cout « val; ) else if (*token == 'V ') { // выводит символьную константу, putback(); eval_exp(val); cout « (char) val; } get_token(j; } while(*token == LS); if(*token != ';') throw InterpExc(SEMI_EXPECTED); } Когда в коде обнаружен идентификатор cout, читается следующая лексема. Если она не «, то выводится сообщение о синтаксической ошибке. В противном случае выполняется цикл, который получает и затем выводит строку или значение выражения, расположенные справа от комбинации символов «. Этот процесс продолжается до тех пор, пока не будет достигнут коней оператора cout. Оператор cin обрабатывается функцией exec_cin (), приведенной далее. // Выполняет оператор cin. void exec_cin() { int val; char chval; token_ireps vtype; gec_token(); if(*token != RS) throw InterpExc(SYNTAX); do { get_token(); if(token_type != IDENTIFIER) throw InterpExc(NOT_VAR); vtype = find_var_type(token); if(vtype == CHAR) { cin » chval; ass ign_var(token» chval); } else if(vtype == INT) { cin » val; assign_var(token, val); } get_token(); } while(*token == RS); if(*token != ';') throw InterpExc(SEMI_EXPECTED); } Когда обнаружен идентификатор cin, читается следующая лексема. Если она не », то выводится сообщение о синтаксической ошибке. В противном случае выполняется цикл, который получает имя переменной для вводимого значения, читает с консоли это значение и запоминает его в переменной. Обратите внимание на то, что определяется тип переменной: считывается целое число или символьные данные. Этот процесс продолжается до тех пор, пока не обнаружен конец оператора cin.
|