(*~\Глагол\Отделы\ИныеЯП\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                        ОТДЕЛ Слова_ГлаголOberon07ru;
(*============================================================================*)
(* НАЗНАЧЕНИЕ: основные задачи и соответствие слов Глагола и
//                 ЯП руссифицированный Oberon07
\\                       для приложения Oberon07ruВГлагол.отд                 *)
(*============================================================================*)

ИСПОЛЬЗУЕТ 
  ИзФайла ИЗ "..\..\Отделы\Обмен\ВводВывод\",
   ВФайл  ИЗ "..\..\Отделы\Обмен\ВводВывод\",

 оЗнака   ИЗ "..\..\Отделы\Иное\",
 оБуквы   ИЗ "..\..\Отделы\Иное\", 
 оЦепи    ИЗ "..\..\Отделы\Иное\",
  Пустой  ИЗ "..\..\Отделы\Иное\",
 оРядаД   ИЗ "..\..\Отделы\Иное\";

ПОСТ
  ЗапасСлов=100; (*            запас ключевых  слов  *)
  ДлинаСлова=32; (* наибольшая длина ключевого Слова *)

ВИД
                     нСлово=НАБОР(Пустой.Вид)
     г,о:ЦЕПЬ[ДлинаСлова] 
                            КОН;
  ДкСлову = ДОСТУП К нСлово;        (* доступ к набору=паре из Глагол-слова и
                                          соответствующего ему Оберон-слова   *)
ПЕР
  рКлючевыеСлова:РЯД ЗапасСлов ИЗ Пустой.Доступ; (*   ряд ключевые слова *)
      всегоСлов :ЦЕЛ;                            (* число ключевых слов  *)

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА СравнитьРяды(с1-,с2-:Пустой.Вид):ЦЕЛ;
УКАЗ
  ВОЗВРАТ оЦепи.Сравнить(с1(нСлово).о, с2(нСлово).о)
КОН СравнитьРяды;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Перевод-(ч:ИзФайла.ДкПотоку;
                п:  ВФайл.ДкПотоку);
ПЕР
       з:ЗНАК;   (* следующий знак *)
  слово :нСлово; (* пробное 'слово' в виде НАБОРа *)
  нашлиД:Пустой.Доступ;

 (*...............................подЗадача...*)
  ЗАДАЧА Пропуск;                            (* Пропуск знака без обработки   *)
  УКАЗ
         ВФайл.ЗнакЦепи(п,з);
    з:=ИзФайла.ЗнакЦепи(ч)
  КОН Пропуск;

 (*...............................подЗадача...*)
  ЗАДАЧА ЧитатьСлово(ц+:ЦЕПЬ);               (* Чтение слова в цепочку знаков *)
  ПЕР
    п:ЦЕЛ; (* позиция для чтения в цепочку *)
  УКАЗ
           п:=0;
    ПОВТОРЯТЬ
      ЕСЛИ п < ДлинаСлова-1 ТО 
         ц[п]:=з; 
        УВЕЛИЧИТЬ(п) 
      КОН;
      з:=ИзФайла.ЗнакЦепи(ч)
    ДО НЕ оЗнака.ВСлове(з);

         ц[п]:=0X
  КОН ЧитатьСлово;

УКАЗ
         з:=ИзФайла.ЗнакЦепи(ч);
  ПОКА
         НЕ ИзФайла.Конец(ч)
  ВЫП
    ПОКА
        (НЕ ИзФайла.Конец(ч)) И (з <= " ")
    ВЫП 
      Пропуск 
    КОН;
    ЕСЛИ
         оБуквы.Известная(з) ИЛИ (з = "_")
    ТО 
      ЧитатьСлово(слово.о);

           нашлиД:=оРядаД.Поиск(слово,рКлючевыеСлова,всегоСлов,СравнитьРяды);
      ЕСЛИ
           нашлиД # ПУСТО
      ТО                                                    (* преобразование
                           нашлиД         из Пустой.Доступ в
                                  ДкСлову <- Пустой.Доступ                    *)
        ВФайл.ЦепьЗнаков(п,нашлиД(ДкСлову).г)
                         (* запись в файл .г-слова *)
      ИНАЧЕ
        ВФайл.ЦепьЗнаков(п,слово.о)
                         (* запись в файл .о-слова *)
      КОН
(*-------------------< проверка одиночных знаков: з="&", з="~" >--------------*)
    АЕСЛИ
          з = "&"
    ТО
           ВФайл.ЗнакЦепи(п,"И");
      з:=ИзФайла.ЗнакЦепи(ч);
      ЕСЛИ
          оЗнака.ВСлове(з)
      ТО
           ВФайл.ЗнакЦепи(п," ")
      КОН
    АЕСЛИ
          з = "~"
    ТО
           ВФайл.ЦепьЗнаков(п,"НЕ");
      з:=ИзФайла.ЗнакЦепи(ч);
      ЕСЛИ
          оЗнака.ВСлове(з)
      ТО
           ВФайл.ЗнакЦепи(п," ")
      КОН
    ИНАЧЕ 
      Пропуск 
    КОН
  КОН;
КОН Перевод;

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА ВвестиСлово(г-,о-:ЦЕПЬ);
ПЕР
  словоД:ДкСлову;  (* доступ к набору нСлово *)
УКАЗ
  СОЗДАТЬ(словоД);
  СПИСАТЬ(о,словоД.о);
  СПИСАТЬ(г,словоД.г);
  оРядаД.Вставка(словоД,рКлючевыеСлова,всегоСлов,СравнитьРяды)
КОН ВвестиСлово;

(*-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS-*)
УКАЗ
  всегоСлов:=0;
              (*--- Ключевые слова руссифицированного Oberon07ru -> Глагол ---*)

  ВвестиСлово("Адрес",     "ОШИБКА! в рус.Ob07 нет Адрес");
  ВвестиСлово("ОШИБКА! в Глаголе нет АРИФМЕТИЧЕСКИЙ_СДВИГ", "АРИФМЕТИЧЕСКИЙ_СДВИГ"); (* ASH *) (* см. Асм.Сдвиг() *)
  ВвестиСлово("ОШИБКА! в Глаголе нет СИМВОЛ_Latin1",        "СИМВОЛ_Latin1");
  ВвестиСлово("ОШИБКА! в Глаголе нет ЗАГЛАВНАЯ_ЛАТ",        "ЗАГЛАВНАЯ_ЛАТ");
  ВвестиСлово("СПИСАТЬ",   "ОШИБКА! в рус.Ob07 нет СПИСАТЬ");                        (* COPY *)
  ВвестиСлово("ОШИБКА! в Глаголе нет ЗАКРЫТИЕ_МОДУЛЯ",      "ЗАКРЫТИЕ_МОДУЛЯ");

  ВвестиСлово("ИзПамяти",  "ОШИБКА! в рус.Ob07 нет ИзПамяти");                       (* SYSTEM.GET *)
  ВвестиСлово("ШИРВЕЩ",    "ОШИБКА! в рус.Ob07 нет ШИРВЕЩ");                         (* ДЛИНВЕЩ\LONGREAL *)
  ВвестиСлово("Образ",     "ОШИБКА! в рус.Ob07 нет Образ");                          (* SYSTEM.MOVE *)
  ВвестиСлово("Доступ",    "ОШИБКА! в рус.Ob07 нет Доступ");
  ВвестиСлово("ВПамять",   "ОШИБКА! в рус.Ob07 нет ВПамять");                        (* SYSTEM.PUT *)

  ВвестиСлово("ОШИБКА! в Глаголе нет ВЕЩЕСТВЕННОЕ_МАЛОЕ",   "ВЕЩЕСТВЕННОЕ_МАЛОЕ");   (* SHORTREAL *)
  ВвестиСлово("Значение",  "ОШИБКА! в рус.Ob07 нет Значение");
  ВвестиСлово("ОШИБКА! в Глаголе нет ДЛЯ_НАСЛЕДОВАНИЯ",     "ДЛЯ_НАСЛЕДОВАНИЯ");     (* SHORTREAL *)
  ВвестиСлово("ОШИБКА! в Глаголе нет ПЕРЕОПРЕДЕЛЯЕМЫЙ",     "ПЕРЕОПРЕДЕЛЯЕМЫЙ");     (* EXTENSIBLE *)
  ВвестиСлово("ОШИБКА! в Глаголе нет ВНУТРИ_МОДУЛЯ",        "ВНУТРИ_МОДУЛЯ");
  ВвестиСлово("ОШИБКА! в Глаголе нет ИСКЛЮЧИТЬ",            "ИСКЛЮЧИТЬ");            (* EXCL *)
  ВвестиСлово("ОШИБКА! в Глаголе нет ВКЛЮЧИТЬ",             "ВКЛЮЧИТЬ");             (* INCL *)
  ВвестиСлово("ОШИБКА! в Глаголе нет РАЗМЕР",               "РАЗМЕР");               (* SIZE *)
  ВвестиСлово("ОШИБКА! в Глаголе нет ФИНАЛИЗИРОВАТЬ",       "ФИНАЛИЗИРОВАТЬ");       (* FINALIZE *)

                                      (*--- Служебные СЛОВА ---*)
  ВвестиСлово("АЕСЛИ",     "АЕСЛИ");          (* ELSIF *)
  ВвестиСлово("БЕГУНОК", "ОШИБКА! в рус.Ob07 нет БЕГУНОК=RIDER");
(*ВвестиСлово("БЕГУНОК",   "-RIDER");     *)         (* -RIDER *)
  ВвестиСлово("В",         "ВХОДИТ");         (* IN *)
  ВвестиСлово("ВИД",       "ТИПЫ");           (* TYPE *)
  ВвестиСлово("ВОЗВРАТ",   "ВЕРНУТЬ");        (* RETURN *)
  ВвестиСлово("ВЫБРАТЬ",   "ВЫБРАТЬ");        (* CASE *)
  ВвестиСлово("ВЫП",       "ДЕЛАТЬ");         (* DO *)
  ВвестиСлово("ВЫХОД",   "ОШИБКА! в рус.Ob07 нет ВЫХОД=EXIT");
(*ВвестиСлово("ВЫХОД",     "-EXIT");      *)       (* -EXIT *)
  ВвестиСлово("ДЕЛИТЬ",    "DIV");            (* -DIV *)
  ВвестиСлово("ДЛЯ",     "ОШИБКА! в рус.Ob07 нет ДЛЯ=WITH");
(*ВвестиСлово("ДЛЯ",       "-WITH");      *)     (* -WITH *)
  ВвестиСлово("ДО",        "СНОВА");          (* UNTIL    *)
  ВвестиСлово("ДО",        "ДО");             (* UNTIL TO *)
  ВвестиСлово("ДОСТУП К",  "УКАЗАТЕЛЬ НА");   (* POINTER TO *)
  ВвестиСлово("ДОСТУП",    "УКАЗАТЕЛЬ");      (* POINTER    *)
  ВвестиСлово("ЕСЛИ",      "ЕСЛИ");           (* IF *)
  ВвестиСлово("ЯВЛЯЕТСЯ",  "ЕСТЬ");           (* IS *)
  ВвестиСлово("ЗАДАЧА",    "ПРОЦЕДУРА");      (* PROCEDURE *)
(*ВвестиСлово("И",         "&"); *)           (* & *)
  ВвестиСлово("ИЗ",        "ИЗ");             (* OF *)
  ВвестиСлово("ИЛИ",       "ИЛИ");            (* OR *)
  ВвестиСлово("ИНАЧЕ",     "ELSE");           (* ELSE *)
  ВвестиСлово("ИСПОЛЬЗУЕТ","ИМПОРТ");         (* IMPORT *)
  ВвестиСлово("К",         "НА");             (* POINTER TO *)
  ВвестиСлово("КОЛЬЦО",  "ОШИБКА! в рус.Ob07 нет КОЛЬЦО=LOOP");
(*ВвестиСлово("КОЛЬЦО",    "-LOOP");      *)        (* -LOOP *)
  ВвестиСлово("КОН",       "КОНЕЦ");          (* END *)
  ВвестиСлово("НАБОР",     "ЗАПИСЬ");         (* RECORD *)
(*ВвестиСлово("НЕ",        "~"); *)           (* -NOT \ ~ *)
  ВвестиСлово("ОСТАТОК",   "MOD");            (* -MOD *)
  ВвестиСлово("ОТ",        "ДЛЯ");            (* FOR *)
  ВвестиСлово("ОТДЕЛ",     "МОДУЛЬ");         (* MODULE *)
  ВвестиСлово("ПЕР",       "ПЕРЕМ");          (* VAR *)
  ВвестиСлово("ПО",        "ПО");             (* BY *)
  ВвестиСлово("ПОВТОРЯТЬ", "ПОВТОРЯТЬ");      (* REPEAT *)
  ВвестиСлово("ПОКА",      "ПОКА");           (* WHILE *)
  ВвестиСлово("ПОСТ",      "КОНСТ");          (* CONST *)
  ВвестиСлово("ОШИБКА! в Глаголе нет ПУСТОЙ","ПУСТОЙ");     (* NIL *)
  ВвестиСлово("ПУСТО",     "NIL");            (* NIL *)
  ВвестиСлово("РЯД",       "МАССИВ");         (* ARRAY *)
  ВвестиСлово("ТО",        "ТОГДА");          (* THEN *)
  ВвестиСлово("УКАЗ",      "НАЧАЛО");         (* BEGIN *)

                                      (*--- ВИДы, ВстрЗадачи ---*)
  ВвестиСлово("ВЗНАК",     "CHR");            (* -CHR    - ВстрЗадача *)
  ВвестиСлово("ВЦЕЛ",      "ORD");            (* -ORD    - ВстрЗадача *)
  ВвестиСлово("ВШИРЦЕЛ",   "ENTIER");         (* -ENTIER - ВстрЗадача (ЦЕЛЧАСТЬ) *)
  ВвестиСлово("РАЗМЕР",    "LEN");            (* -LEN    - ВстрЗадача *)
  ВвестиСлово("МАКС",      "MAX");            (* -MAX    - ВстрЗадача *)
  ВвестиСлово("МИН",       "MIN");            (* -MIN    - ВстрЗадача *)
  ВвестиСлово("МОДУЛЬ",    "ABS");            (* -ABS    - ВстрЗадача (абсолютная величина цел.числа) *)
  ВвестиСлово("НЕ ЧЕТ",    "НЕ_ЧЕТ");         (* -ODD    - ВстрЗадача *)
  ВвестиСлово("СПИСАТЬ",   "COPY");           (* -COPY   - ВстрЗадача *)
  ВвестиСлово("СТОП",      "HALT");           (* -HALT   - ВстрЗадача *)

  ВвестиСлово("ВКЛ",       "ИСТИНА");         (* TRUE *)
  ВвестиСлово("ОТКЛ",      "ЛОЖЬ");           (* FALSE *)
  ВвестиСлово("КЛЮЧ",      "ЛОГИЧЕСКАЯ");     (* BOOLEAN  - вид *)
  ВвестиСлово("ЗНАК",      "СИМВ");           (* CHAR     - вид *)
  ВвестиСлово("МНОЖ",      "МНОЖЕСТВО");      (* -SET      - вид *)

  ВвестиСлово("ПРОВЕРИТЬ", "ПРОВЕРИТЬ");      (* ASSERT - ВстрЗадача *)
  ВвестиСлово("СОЗДАТЬ",   "НОВ");            (* NEW    - ВстрЗадача *)
  ВвестиСлово("УВЕЛИЧИТЬ", "ДОБ");            (* INC    - ВстрЗадача *)
  ВвестиСлово("УМЕНЬШИТЬ", "ВЫЧ");            (* DEC    - ВстрЗадача *)
  ВвестиСлово("УЗК",       "КОРОТ");          (* SHORT  - ВстрЗадача укоротить\ссузить *)

  ВвестиСлово("УЗКЦЕЛ",    "КОРОТ");          (* SHORT    - вид SHORTINT *)
  ВвестиСлово("ЦЕЛ",       "ЦЕЛОЕ");          (* INTEGER  - вид *)
  ВвестиСлово("ШИРЦЕЛ",    "ДЛИН");           (* LONG     - вид LONGINT *)
  ВвестиСлово("ВЕЩ",       "ВЕЩ");            (* REAL     - вид *)
  ВвестиСлово("ШИРВЕЩ",    "ДЛИНВЕЩ");        (* LONGREAL - вид *)

                                      (*--- особый отдел ОБХОД/SYSTEM ---*)
  ВвестиСлово("ОБХОД",        "SYSTEM");
  ВвестиСлово("ОБХОД.Ячейка", "SYSTEM.BYTE");
  ВвестиСлово("ОБХОД.Доступ", "SYSTEM.PTR");
  ВвестиСлово("ОБХОД.Адрес",  "SYSTEM.ADDRESS");    (* SYSTEM.ADDRESS - ВИД адрес переменной *)
  ВвестиСлово("Ячейка",              "BYTE");
  ВвестиСлово("Доступ",              "PTR");
  ВвестиСлово("Адрес",               "ADDRESS");    (* SYSTEM.ADDRESS - ВИД адрес переменной *)

(*-- ЗАДАЧИ/функции ОТДЕЛа ОБХОД --*)
  ВвестиСлово("ОБХОД.ПолучитьАдрес", "SYSTEM.ADR"); (* SYSTEM.ADR - вычислить/преобразовать к адресу *)
  ВвестиСлово("ОБХОД.Значение",      "SYSTEM.VAL"); (* SYSTEM.VAL - ОБХОД.Значение(МНОЖ,и32) - преобразовать к ВИДу
                                                                    ОБХОД.Значение(ЯЧЦЕЛ,регистр[номербайта]) *)
  ВвестиСлово("ПолучитьАдрес",              "ADR"); (* SYSTEM.ADR - вычислить/преобразовать к адресу *)
  ВвестиСлово("Значение",                   "VAL"); (* SYSTEM.VAL - ОБХОД.Значение(МНОЖ,и32) - преобразовать к ВИДу
                                                                    ОБХОД.Значение(ЯЧЦЕЛ,регистр[номербайта]) *)
(*-- ЗАДАЧИ/не функции ОТДЕЛа ОБХОД --*)
  ВвестиСлово("ОБХОД.ИзПамяти", "SYSTEM.GET");
  ВвестиСлово("ОБХОД.ВПамять",  "SYSTEM.PUT");
  ВвестиСлово("ОБХОД.Образ",    "SYSTEM.MOVE");
  ВвестиСлово("ИзПамяти",              "GET");
  ВвестиСлово("ВПамять",               "PUT");
  ВвестиСлово("Образ",                 "MOVE");
(*
  ВвестиСлово("ОБХОД.Узк",             "SHORT");  (* SHORT/ССУЗИТЬ - преобразовать в 2 раза меньшее по числу байт *)
 *)
КОН Слова_ГлаголOberon07ru.
	