Explorar o código

Multilingual Oberon experiment

Arthur Yefimov %!s(int64=3) %!d(string=hai) anos
pai
achega
15fb7d2bd7
Modificáronse 3 ficheiros con 49 adicións e 15 borrados
  1. 7 7
      Data/Texts/ru.dat
  2. 28 0
      Programs/ЧтениеЧисел.Mod
  3. 14 8
      src/Editor.Mod

+ 7 - 7
Data/Texts/ru.dat

@@ -208,7 +208,7 @@ menuCut "&Вырезать"
 menuCopy "&Копировать"
 menuPaste "В&ставить"
 menuClear "&Удалить"
-menuSelectAll "Выделить в&сё"
+menuSelectAll "В&ыделить всё"
 menuUnselect "С&нять выделение"
 menuSearch "По&иск"
 menuFind "&Найти..."
@@ -222,10 +222,10 @@ menuParameters "&Параметры..."
 menuCompile "&Компиляция"
 menuMake "&Смастерить"
 menuMakeAndRun "Смастерить и &запустить"
-menuBuild "&Собрать"
-menuDebug "&Отладка"
+menuBuild "Со&брать"
+menuDebug "О&тладка"
 menuOutput "&Вывод"
-menuTools "&Сервис"
+menuTools "С&ервис"
 menuMessages "С&ообщения"
 menuCalculator "&Калькулятор"
 menuAsciiTable "&Таблица Ascii"
@@ -247,7 +247,7 @@ menuLearnKeys "Изучить &клавиши"
 menuOpenOptions "&Открыть..."
 menuSaveOptions "&Сохранить"
 menuSaveOptionsAs "Сохранить &как..."
-menuWindow "&Окно"
+menuWindow "Ок&но"
 menuTile "&Замостить"
 menuCascade "&Каскад"
 menuCloseAll "З&акрыть все"
@@ -255,10 +255,10 @@ menuSizeMove "&Размер/двигать"
 menuZoom "Раз&вернуть"
 menuNextWindow "&Следующее"
 menuPreviousWindow "&Предыдущее"
-menuCloseWindow "Зак&рыть"
+menuCloseWindow "Закр&ыть"
 menuListWindows "Сп&исок..."
 menuRefreshDisplay "&Обновить дисплей"
-menuHelp "Сп&равка"
+menuHelp "&Справка"
 menuContents "&Содержание"
 menuIndex "И&ндекс"
 menuTopicSearch "По&иск по темам"

+ 28 - 0
Programs/ЧтениеЧисел.Mod

@@ -0,0 +1,28 @@
+МОДУЛЬ ЧтениеЧисел;
+ИМПОРТ Тексты, Ввод, Вывод;
+ПЕРЕМЕННЫЕ
+  имя: МАССИВ 100 ИЗ ЛИТЕРА;
+  а, б, в: ЦЕЛОЕ;
+  Т: Тексты.Текст;
+  С: Тексты.Сканер;
+НАЧАЛО
+  Вывод.Строка("Введите имя файла: ");
+  Ввод.Ряд(имя);
+
+  НОВЫЙ(Т);
+  Тексты.Открыть(Т, имя);
+  ЕСЛИ Т.длина = 0 ТОГДА
+    Вывод.Строка("Файл пуст."); Вывод.Перенос
+  ИНАЧЕ
+    Тексты.ОткрытьСканер(С, Т, 0);
+    Тексты.Сканировать(С);
+    ЕСЛИ С.класс = Тексты.Целое ТОГДА
+      а := С.и;
+      Вывод.Строка("Прочитано целое число: ");
+      Вывод.Целое(а); Вывод.Перенос
+    АЕСЛИ С.класс = Тексты.Имя ТОГДА
+      Вывод.Строка("Прочитано слово: ");
+      Вывод.Строка(С.с); Вывод.Перенос
+    КОНЕЦ
+  КОНЕЦ
+КОНЕЦ ЧтениеЧисел.

+ 14 - 8
src/Editor.Mod

@@ -362,13 +362,16 @@ END StringsFindPrev;
 PROCEDURE GetCharClass(ch: CHAR): INTEGER;
 VAR class: INTEGER;
 BEGIN
-  CASE ch OF
-    'a'..'z', 'A'..'Z', '_': class := charAlpha
-  | '0'..'9': class := charDigit
-  | '-', '+': class := charMinusPlus
-  | '"', "'": class := charQuote
-  | '(': class := charOpenBracket
-  ELSE class := charOther END ;
+  IF ('a' <= ch) & (ch <= 'z') OR ('A' <= ch) & (ch <= 'Z') OR
+     ('а' <= ch) & (ch <= 'я') OR ('А' <= ch) & (ch <= 'Я') OR
+     (ch = 'ё') OR (ch = 'Ё')
+  THEN class := charAlpha
+  ELSIF ('0' <= ch) & (ch <= '9') THEN class := charDigit
+  ELSIF (ch = '-') & (ch = '+') THEN class := charMinusPlus
+  ELSIF (ch = '"') OR (ch = "'") THEN class := charQuote
+  ELSIF ch = '(' THEN class := charOpenBracket
+  ELSE class := charOther
+  END ;
 RETURN class END GetCharClass;
 
 PROCEDURE IsHexDigit(ch: CHAR): BOOLEAN;
@@ -385,7 +388,7 @@ VAR part: ARRAY 32 OF CHAR; result: BOOLEAN;
   BEGIN RETURN keyword = part
   END KW;
 BEGIN
-  IF (s[x] >= 'A') & (s[x] <= 'Z') THEN
+  IF (s[x] >= 'A') & (s[x] <= 'Z') OR (s[x] >= 'А') & (s[x] <= 'Я') THEN
     Strings.Extract(s, x, len, part);
     result := KW('ABS') OR KW('ASH') OR KW('BOOLEAN') OR KW('CAP') OR
       KW('CHAR') OR KW('CHR') OR KW('COPY') OR KW('DEC') OR KW('ENTIER') OR
@@ -404,6 +407,9 @@ BEGIN
       KW('UNTIL') OR KW('CONST') OR KW('MOD') OR KW('FLOOR') OR KW('LSL') OR
       KW('ASR') OR KW('ROR') OR KW('ASSERT') OR KW('BYTE') OR
       KW('SHORTCHAR') OR KW('SYSTEM')
+      OR KW('МОДУЛЬ') OR KW('ИМПОРТ') OR KW('ПЕРЕМЕННЫЕ') OR KW('МАССИВ') OR
+      KW('ИЗ') OR KW('ЛИТЕРА') OR KW('ЦЕЛОЕ') OR KW('НАЧАЛО') OR KW('НОВЫЙ') OR
+      KW('ЕСЛИ') OR KW('ТОГДА') OR KW('ИНАЧЕ') OR KW('АЕСЛИ') OR KW('КОНЕЦ')
   ELSE result := FALSE
   END ;
 RETURN result END IsKeywordInString;