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

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

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

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

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

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

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

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

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

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

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

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

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

                  (* эти замены придётся делать вручную в текстовом редакторе *)
  ВвестиСлово("[",  "(");
  ВвестиСлово("]",  ")");
  ВвестиСлово(":=", "=");
  ВвестиСлово(" ДЕЛИТЬ ",  "/");
(*                                  Слово с точки не может начинаться
  ВвестиСлово("=",         ".EQ.");   (* .EQ. *)
  ВвестиСлово("<",         ".LT.");   (* .LT. *)
  ВвестиСлово(">",         ".GT.");   (* .GT. *)
  ВвестиСлово("<=",        ".LE.");   (* .LE. *)
  ВвестиСлово(">=",        ".GE.");   (* .GE. *)
  ВвестиСлово("ИЛИ",       ".OR.");   (* .OR. *)
  ВвестиСлово("И",         ".AND.");  (* .AND. *)
  ВвестиСлово("ОТКЛ",      ".F.");    (* .F. *)
  ВвестиСлово("ВКЛ",       ".T.");    (* .T. *)
*)
                  (* это тоже  придётся править вручную в текстовом редакторе *)
  ВвестиСлово("=",         "EQ");   (* .=.   .EQ. *)
  ВвестиСлово("<",         "LT");   (* .<.   .LT. *)
  ВвестиСлово(">",         "GT");   (* .>.   .GT. *)
  ВвестиСлово("<=",        "LE");   (* .<=.  .LE. *)
  ВвестиСлово(">=",        "GE");   (* .>=.  .GE. *)
  ВвестиСлово("ИЛИ",       "OR");   (* .ИЛИ. .OR. *)
  ВвестиСлово("И",         "AND");  (* .И.   .AND. *)
(*  ВвестиСлово("ОТКЛ",      "F");*)(* ОТКЛ  .F. *)
(*  ВвестиСлово("ВКЛ",       "T");*)(* ВКЛ   .T. *)
  ВвестиСлово("ПЕРЕЙТИнаМЕТКУ", "GOTO");

                                (*------ Служебные СЛОВА *)
  ВвестиСлово("ОТДЕЛ",     "PROGRAMM");
  ВвестиСлово("ОТДЕЛ",     "MODULE");
  ВвестиСлово("ЗАДАЧА",    "SUBROUTINE"); (* PROCEDURE *)

  ВвестиСлово("ПОСТ",      "DATA");

  ВвестиСлово("ОТ ДО",     "FOR");
  ВвестиСлово("ОТ ДО ВЫП", "DO");
  ВвестиСлово("ПО",        "BY");

  ВвестиСлово("ЕСЛИ",      "IF");

  ВвестиСлово("КОН",       "END");
  ВвестиСлово("КОН",       "ENDIF");
  ВвестиСлово("КОН",       "CONTINUE");

  ВвестиСлово("ВОЗВРАТ",   "RETURN");
  ВвестиСлово("ВЫХОД",     "EXIT");

  ВвестиСлово("АЕСЛИ",     "ELSIF");
  ВвестиСлово("ТО",        "THEN");
  ВвестиСлово("ИНАЧЕ",     "ELSE");

  ВвестиСлово("ВЕЩ",       "REAL");
  ВвестиСлово("ШИРВЕЩ",    "DOUBLE");
  ВвестиСлово("ЦЕЛ",       "INTEGER");
  ВвестиСлово("ШИРЦЕЛ",    "LONGINT");
(*
  ВвестиСлово("ШИРЦЕЛ",    "INTEGER");
  ВвестиСлово("ШИРВЕЩ",    "LONGREAL");
 *)
  ВвестиСлово("ОСТАТОК",   "MOD");
(*                                  этих слов Глагола нету в Fortran
  ВвестиСлово("БЕГУНОК",   "RIDER");
  ВвестиСлово("В",         "IN");
  ВвестиСлово("ВИД",       "TYPE");
  ВвестиСлово("ВЫБРАТЬ",   "CASE");
  ВвестиСлово("ДЕЛИТЬ",    "DIV");
  ВвестиСлово("ДЛЯ",       "WITH");
  ВвестиСлово("ДО",        "UNTIL");
  ВвестиСлово("ДОСТУП",    "POINTER");
  ВвестиСлово("ЯВЛЯЕТСЯ",  "IS");
(* ВвестиСлово("И",         "&"); *)
  ВвестиСлово("ИЗ",        "OF");
  ВвестиСлово("ИЛИ",       "OR");
  ВвестиСлово("ИСПОЛЬЗУЕТ","IMPORT");
  ВвестиСлово("К",         "TO");
  ВвестиСлово("КОЛЬЦО",    "LOOP");
  ВвестиСлово("НАБОР",     "RECORD");
  ВвестиСлово("НАБОРcla",  "CLASS");
  ВвестиСлово("НЕ",        "NOT");  (* ISO XDS *)
(*  ВвестиСлово("НЕ",        "~"); *)
  ВвестиСлово("ПЕР",       "VAR");
  ВвестиСлово("ПОВТОРЯТЬ", "REPEAT");
  ВвестиСлово("ПОКА",      "WHILE");
  ВвестиСлово("ПУСТО",     "NIL");
  ВвестиСлово("РЯД",       "ARRAY");
  ВвестиСлово("УКАЗ",      "BEGIN");

                                (*------ ВИДы, ВстрЗадачи *)
  ВвестиСлово("ВЗНАК",     "CHR");
  ВвестиСлово("ВЦЕЛ",      "ORD");
  ВвестиСлово("ВШИРЦЕЛ",   "ENTIER");(* ЦЕЛЧАСТЬ *)
  ВвестиСлово("ВКЛ",       "TRUE");
  ВвестиСлово("РАЗМЕР",    "HIGH");  (* РАЗМЕР(ряда) //длина ряда *)
  ВвестиСлово("ДЛИНА",     "LENGT"); (* ДЛИНА //длина строки *)
  ВвестиСлово("ДЛИНА",     "LEN");   (* ДЛИНА //длина строки *)
  ВвестиСлово("ЗНАК",      "CHAR");
  ВвестиСлово("КЛЮЧ",      "BOOLEAN");
  ВвестиСлово("МАКС",      "MAX");
  ВвестиСлово("МИН",       "MIN");
  ВвестиСлово("МНОЖ",      "SET");
  ВвестиСлово("МНОЖ",      "BITSET");
  ВвестиСлово("МОДУЛЬ",    "ABS");
  ВвестиСлово("НЕ ЧЕТ",    "ODD");
  ВвестиСлово("ОТКЛ",      "FALSE");
  ВвестиСлово("ПРОВЕРИТЬ", "ASSERT");
  ВвестиСлово("СОЗДАТЬ",   "NEW");
  ВвестиСлово("СПИСАТЬ",   "COPY");
  ВвестиСлово("СТОП",      "HALT");
  ВвестиСлово("УВЕЛИЧИТЬ", "INC");
  ВвестиСлово("УЗК",       "SHORT");
  ВвестиСлово("УЗКЦЕЛ",    "SHORTINT");
  ВвестиСлово("УМЕНЬШИТЬ", "DEC");

  ВвестиСлово("кнМатем.Вид", "LONGCOMPLEX");
  ВвестиСлово("кнМатем.Вид", "COMPLEX");

                                (*------ особый отдел ОБХОД/SYSTEM *)
  ВвестиСлово("ОБХОД",     "SYSTEM");
  ВвестиСлово("Ячейка",    "BYTE");
  ВвестиСлово("Доступ",    "PTR");
  ВвестиСлово("Адрес",     "ADR");
  ВвестиСлово("Значение",  "VAL");
  ВвестиСлово("ИзПамяти",  "GET");
  ВвестиСлово("ВПамять",   "PUT");
  ВвестиСлово("Образ",     "MOVE");
*)
КОН Слова_ГлаголFortran.
