Главная arrow Программирование С++ arrow Обработка операторов с/л и cout

Обработка операторов с/л и 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.