// Эта заглавная процедура
// подготавливает ящик для вычислений
// перед входом в состояние (вход)
// алгоритма. Подготовка состоит в
// записи символа 0 в ящик. Эту ячейку
// памяти Корректора будем использовать
// как сумматор (накопитель результата)
ЭТО вход0
  ОБМЕН                                
  ПИШИ 0                               
  ОБМЕН                                
  вход                                 
КОНЕЦ                                  
                                       
ЭТО вход  // Состояние (вход).         
  ВПРАВО  // Смотрим следующий символ. 
  // Если 0, переходим в состояние
  // (выражение  без вычислений).
  ЕСЛИ       0 ТО выражение            
  // Если 1 или 2, перед               
  // переходом в состояние (выражение) 
  ИНАЧЕ ЕСЛИ 1 ТО добавить1            
  ИНАЧЕ ЕСЛИ 2 ТО добавить2            
  // Любой другой символ в состоянии
  // (вход) -  ошибка
  ИНАЧЕ ошибка                         
КОНЕЦ                                  
                                       
ЭТО выражение  // Состояние (выражение)
  ВПРАВО  // Смотрим следующий символ. 
  // Если это "+", переходим в состоя- 
  // ние   (вход)- выражение           
  // продолжается.                     
  ЕСЛИ       +     ТО вход             
  // Если это ПУСТО, выражение закон-  
  // чилось.
  ИНАЧЕ ЕСЛИ ПУСТО ТО ответ            
  // Любой другой символ - ошибка.     
  ИНАЧЕ ошибка                         
КОНЕЦ                                  
                                       
                                       
// Вспомогательная переходная процедура
// между состояниями (вход) и          
// (выражение).                        
// В ней к ящику "добавляется" 1.      
// Конечно, команда ПЛЮС не
// арифметическая,  она просто заменяет
// символ на следующий по  алфавиту
// Корректора.  Но, как увидим         
// дальше, это действие совершенно     
// эквивалентно операции "+1".         
ЭТО добавить1                          
  ОБМЕН                                
  ПЛЮС                                 
  ОБМЕН                                
  выражение                            
КОНЕЦ                                  
                                       
                                       
// Вспомогательная переходная процедура
// между состояниями (вход) и          
// (выражение).                        
// В ней к ящику "добавляется" 2.      
ЭТО добавить2                          
  ОБМЕН                                
  ПЛЮС ПЛЮС                            
  ОБМЕН                                
  выражение                            
КОНЕЦ                                  
                                       
// Идем от ошибочного символа до конца 
// записи, сжимая рекурсивную пружину. 
// Записываем в конце записи сообщение 
// об ошибке и под воздействием        
// "энергии" закрученных витков        
// возвращаем  окно на место ошибки.   
ЭТО ошибка                             
  ВПРАВО                               
  ЕСЛИ ПУСТО                           
    ТО ответ_ошибка                    
    ИНАЧЕ ошибка                       
  ВЛЕВО                                
КОНЕЦ                                  
                                       
// Сообщение об ошибке.                
ЭТО ответ_ошибка                       
  ВПРАВО ПИШИ О                        
  ВПРАВО ПИШИ Ш                        
  // Переместиться назад на 2 клетки не
  // необходимо для того, чтобы точно  
  // попасть "подпружину".             
  ПОВТОРИ 2 ВЛЕВО                      
КОНЕЦ                                  
                                       
                                       
// Запись ответа в виде числа на ленте.
// Для преобразования символа в число
// используется процедура
// Символ_в_число,
// описанная в главе 5 части II.
// Символьное число из ящика - на ленту
ЭТО ответ                              
  ВПРАВО ВПРАВО
  ЯЩИК-                                
  Символ_в_число                       
  //  Последний дизайнерский штрих:
  //  знаком "=" отделим результат
  //  от примера.
  ПОКА НЕ ПУСТО ВЛЕВО                  
  ПИШИ =                               
КОНЕЦ                                  
                                       
// Перевод символьного числа в обычное 
// число.                              
// Вход:  окно установлено на символьно
// число.                              
// Выход: окно установлено на младшую  
// цифру результата,                   
// которая теперь занимает ячейк       
// у символьного числа.                
// Ограничение: процедура работает     
// только для символьных               
// чисел, значение которых  меньше 100.
// ------------------------------------
ЭТО Символ_в_число
  ПОКА НЕ ЦИФРА                        
  {                                    
   ПОВТОРИ 10 МИНУС                    
   ВЛЕВО                               
   ЕСЛИ ПУСТО                          
    ТО    ПИШИ 1                       
    ИНАЧЕ ПЛЮС                         
   ВПРАВО                              
  }                                    
КОНЕЦ                                  
