Программирование. Принципы и практика использования C++ Исправленное издание, стр. 102
let var = 7.2;Грамматика принимает следующий вид:
Вычисление: Инструкция Печать Выход Инструкция вычисленияИнструкция: Объявление ВыражениеОбъявление: "let" Имя "=" ВыражениеВычисление — это новое правило вывода в грамматике. Оно выражает цикл (в функции
calculate()double statement(){ Token t = ts.get(); switch (t.kind) { case let: return declaration(); default: ts.putback(t); return expression(); }}Вместо функции
expression()calculate()statement()void calculate(){ while (cin) try { cout << prompt; Token t = ts.get(); while (t.kind == print) t=ts.get(); // игнорируем "печать" if (t.kind == quit) return; // выход ts.putback(t); cout << result << statement() << endl; } catch (exception& e) { cerr << e.what() << endl; // выводим сообщение об ошибке clean_up_mess(); }}Теперь необходимо написать функцию
declaration()letnamevar_tablevector<Variable>Variableget_value()set_value()let v1 = 7;let v1 = 8;Мы решили, что повторное определение является ошибкой. Обычно это просто синтаксическая ошибка. Вероятно, мы имели в виду не то, что написали, а следующие инструкции:
let v1 = 7;let v2 = 8;Определение объекта класса
Variablevarval1. Проверяем, существует ли в векторе
var_tableVariablevar2. Добавляем пару (
varvalvar_tableМы не должны использовать неинициализированные переменные, поэтому определили функции
is_declared()define_name()bool is_declared(string var) // есть ли переменная var в векторе var_table?{ for (int i = 0; i<var_table.size(); ++i) if (var_table[i].name == var) return true; return false;}double define_name(string var, double val) // добавляем пару (var,val) в вектор var_table{ if (is_declared(var)) error(var,"declared twice"); var_table.push_back(Variable(var,val)); return val;}Добавить новый объект класса
Variablevector<Variable>push_back()var_table.push_back(Variable(var,val));Вызов конструктора
Variable(var,val)Variablepush_back()var_tableletnamedeclaration()