Задача a (6 баллов) Проверка программы 2.

Определение
-----------
<программа>   := <команда>|<программа><команда>
<команда>     := <простая>|<цикл>
<простая>     := л|п|в|н
<цикл>        := ц<повторитель><команда>
<повторитель> := 4|5

Проверить, является ли запись во второй строке поля программой.
В начальный момент Кукарача расположен перед кубиками с записью:

¤запись

Если проверяемая запись - программа, установить Кукарачу в конец
записи:

 запись¤

Если запись - не программа, поставить исполнитель под первым неверным
символом:

запись
  ¤

п р о в е р к а  к у р а т о р а

Давайте посмотрим чем отличается "программа" в смысле определения
задачи 9 от программы в смысле определения задачи "a".

Определение 9
-----------
<программа>   := <команда>|<программа><команда>    (9.1)
<команда>     := <простая>|<цикл>                  (9.2)
<простая>     := л|п|в|н                           (9.3)
<цикл>        := ц<повторитель><простая>           (9.4)
<повторитель> := 4|5                               (9.5)


Определение a
-----------
<программа>   := <команда>|<программа><команда>    (a.1)
<команда>     := <простая>|<цикл>                  (a.2)
<простая>     := л|п|в|н                           (a.3)
<цикл>        := ц<повторитель><команда>           (a.4)
<повторитель> := 4|5                               (a.5)


Определение 9 говорит, что программа это:
-- отдельна команда (9.1) или
-- программа, за которой написана команда (9.1), то есть,
   последовательность команд.

Команда это:
-- простая (9.2) или
-- цикл (9.2)

Простая это:
-- один из символов л, п, в или н (9.3)

Цикл это:
-- симол ц за которым записан повторитель, а за ним простая (9.4)

Повторитель это:
-- один из символов 4 или 5

Из определения 9 следует, например, что
-- Пустая запись не может быть программой.
-- Любая непустая последовательность из символов л, п, в или н -- программа.
-- Любая непустая последовательность из "цDC", где D -- одна из цифр 4 или 5,
   а C -- один из символов л, п, в или н, является программой.
-- Любая последовательность из символов л, п, в или н, в которую
   вставлены конструкции "цDC" является программой.

Примеры программ    Примеры не программ
по определению 9    по определению 9
-----------------------------------------------
л
лпп                 ц5
ц4л                 цл
лц4лц5в             лц4лц5
                    ц5ц4л

В определение a изменена только одна строка:

Строка

<цикл>        := ц<повторитель><простая>           (9.4)

Заменена на

<цикл>        := ц<повторитель><команда>           (a.4)


Что это означает?

Это означает, что за повторителем может идти не только простая
команда, но и снова команда цикла. Иными словами, любая программа в
смысле определения 9 одновременно будет и программой в смысле
определения a. Но не наоборот. Это означает, например, что утверждение
"если запись не является программой в смысле определения 9, то она не
будет являться программой в смысле определения a" -- не является
верным.

Примеры программ    Примеры не программ
по определению a    по определению a
-----------------------------------------------
л
лпп                 ц5
ц4л                 цл
лц4лц5в             лц4лц5
ц5ц4лв              ц5ц4
лц5ц4ц4п            ц5цл


Докажем, например, что запись "ц5ц4лв" -- программа в смысле
определения a.

Запись "ц5ц4лв" будет программой по (a.1), если программой будет
запись "ц5ц4л" так как "в" -- это команда по (a.3):

<программа>   := <команда>|<программа><команда>    (a.1)
                           ц5ц4л      в

Докажем, что запись "ц5ц4л" -- команда, тогда она по (a.1) будет
программой.

Запись "ц5ц4л" будет командой цикла по (a.4), если командой будет
запись "ц4л":

<цикл>        := ц<повторитель><команда>           (a.4)
                 ц5            ц4л

Но запись "ц4л" есть команда цикла по (a.4):

<цикл>        := ц<повторитель><команда>           (a.4)
                 ц4            л

так как "л" является командой по (a.3).

                     * * *

В определениях 9 и a не вкладывается никакой семантики (смысла). Это
только синтаксическое определение. Лексический анализатор транслятора
должен просто проверить запись на соответствие определению.

Ну, а смысл можно вкладывать самый разный. Можно, например,
интерпретировать команды л, п, в и н как команды, перемещающие
исполнителя на клетчатом поле соответственно влево, вправо, вверх и
вниз. Запись ц4л интерпретировать как 4-кратное повторение команды
"л", а запись "ц5ц4л" как 20-кратное повторение команды "л".



Команда 3115
------------
.\15\15.txt
.\15\15a1.coc

Оценка: 6
Автор решения 15a1 Данил Первушин

Диаграмма переходов:


┌────┐       ┌─────────┐      ┌──────┐
│ Да │   ┌─в─┤Программа├в.о.──>Ошибка<─┐
└─^──┘   л   └──────┬──<────┐ └──────┘ │
  п      п          │       4          │
  у      н          ц       5          │
  с ┌────v──┐       └─────>─┴──┐       │
  то│Простая├───ц───────┐ │Цикл├в.о.───┤
    ^────┬─┬┘           └─>────┘       │
    │    │ └──────в.о.─────────────────┘
    л    п
    └в│н─┘


 А вот и сама программа:

//-------------------------------------
// описание
ЭТО Транслятор                         
 Шаг
 ЕСЛИ ц                                
   ТО Цикл                             
 ИНАЧЕ ЕСЛИ л                          
  ТО Простая                           
 ИНАЧЕ ЕСЛИ п                          
  ТО Простая                           
 ИНАЧЕ ЕСЛИ н                          
  ТО Простая                           
 ИНАЧЕ ЕСЛИ в                          
  ТО Простая                           
 ИНАЧЕ Ошибка                          
КОНЕЦ // Транслятор
//-------------------------------------
// описание                            
ЭТО Цикл
 Шаг                                   
 ЕСЛИ 4                                
  ТО Транслятор                        
 ИНАЧЕ ЕСЛИ 5
  ТО Транслятор
 ИНАЧЕ Ошибка                          
КОНЕЦ // Цикл
//-------------------------------------
// описание                            
ЭТО Простая                            
 Шаг                                   
 ЕСЛИ ц                                
  ТО Цикл                              
 ИНАЧЕ ЕСЛИ л                          
  ТО Простая                           
 ИНАЧЕ ЕСЛИ п                          
  ТО Простая
 ИНАЧЕ ЕСЛИ н                          
  ТО Простая
 ИНАЧЕ ЕСЛИ в                          
  ТО Простая                           
 ИНАЧЕ ЕСЛИ ПУСТО
  ТО Да                                
 ИНАЧЕ Ошибка                          
КОНЕЦ // Простая                       
//-------------------------------------
// описание
ЭТО Шаг
 ВНИЗ
 ВПРАВО                                
 ВВЕРХ                                 
КОНЕЦ // Шаг                           
//-------------------------------------
// описание                            
ЭТО Ошибка                             
 Шаг                                   
 ЕСЛИ НЕ ПУСТО                         
  ТО Ошибка                            
 ВЛЕВО
КОНЕЦ // Ошибка                        
//-------------------------------------
// описание                            
ЭТО Да                                 
 ВВЕРХ
КОНЕЦ // Да                            

к о м м е н т а р и й  к у р а т о р а
Программа работает без замечаний.

