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

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

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

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

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

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

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

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

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

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

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

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

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

(*-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS-*)
УКАЗ
  всегоСлов:=0;
                   (*---- Ключевые слова Oberon-2 -> Глагол ----*)

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

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

  ВвестиСлово("ВКЛ",       "TRUE");
  ВвестиСлово("ОТКЛ",      "FALSE");
  ВвестиСлово("ЗНАК",      "CHAR");
  ВвестиСлово("КЛЮЧ",      "BOOLEAN");
  ВвестиСлово("МНОЖ",      "SET");

  ВвестиСлово("ПРОВЕРИТЬ", "ASSERT");
  ВвестиСлово("СОЗДАТЬ",   "NEW");
  ВвестиСлово("УВЕЛИЧИТЬ", "INC");
  ВвестиСлово("УМЕНЬШИТЬ", "DEC");
  ВвестиСлово("УЗК",       "SHORT");  (* SHORT/ССУЗИТЬ - преобразовать в 2 раза меньшее по числу байт *)

  ВвестиСлово("УЗКЦЕЛ",    "SHORTINT");
  ВвестиСлово("ЦЕЛ",       "INTEGER");
  ВвестиСлово("ШИРЦЕЛ",    "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 раза меньшее по числу байт *)
 *)
КОН Слова_ГлаголOberon.
