BlackBox очень подходит для русификации по следующим причинам:
1. Лицензия GPL
2. Современная очень удачная архитектура (компонентно- ориентированное программирование), простое, мощное и безопасное решение, хорошо проработанное.
3. Язык программирования - КомпонентныйПаскаль - близок к Delphi - широко распространённому в бСССР
4. Есть среда визуального программирования и IDE
5. Есть частично русифицированные версии BB1.6
6. Есть большая группа русскоязычных пользователей обладающих высокой квалификацией
Русификация BlackBox
Сообщений 1 страница 8 из 8
Поделиться116-01-2009 22:20:38
Поделиться203-02-2009 16:38:24
Может подскажете (кто знает в каком месте в исходных кодах БлэкБокс1.5 sp4.01 Рус) можно добавить или как сделать замену синонимов операторов IF THEN ELSE на ЕСЛИ ТО ИНАЧЕ (чтобы компилятор перед компиляцией заменял ЕСЛИ ТО ИНАЧЕ на IF THEN ELSE и таким образом переваривал и русские и английские операторы - очень хочется такое сделать сильно помогает пониманию/обучению)
Процедура DevCPS.Get. (в файле... Dev/Mod/CPS.odc для версии Блэкбокс1.5 sp4.01 Рус)
Поделиться303-02-2009 16:46:42
Вот этот кусок кода насколько я понял???
PROCEDURE Get*(VAR sym: BYTE); VAR s: BYTE; old: INTEGER; PROCEDURE Comment; (* do not read after end of file *) BEGIN DevCPM.Get(ch); LOOP LOOP WHILE ch = "(" DO DevCPM.Get(ch); IF ch = "*" THEN Comment END END ; IF ch = "*" THEN DevCPM.Get(ch); EXIT END ; IF ch = DevCPM.Eot THEN EXIT END ; DevCPM.Get(ch) END ; IF ch = ")" THEN DevCPM.Get(ch); EXIT END ; IF ch = DevCPM.Eot THEN err(5); EXIT END END END Comment; BEGIN DevCPM.errpos := DevCPM.curpos-1; WHILE (ch <= " ") OR (ch = 0A0X) DO (*ignore control characters*) IF ch = DevCPM.Eot THEN sym := eof; RETURN ELSE DevCPM.Get(ch) END END ; DevCPM.startpos := DevCPM.curpos - 1; CASE ch OF (* ch > " " *) | 22X, 27X : Str(s) | "#" : s := neq; DevCPM.Get(ch) | "&" : s := and; DevCPM.Get(ch) | "(" : DevCPM.Get(ch); IF ch = "*" THEN Comment; old := DevCPM.errpos; Get(s); DevCPM.errpos := old; ELSE s := lparen END | ")" : s := rparen; DevCPM.Get(ch) | "*" : s := times; DevCPM.Get(ch) | "+" : s := plus; DevCPM.Get(ch) | "," : s := comma; DevCPM.Get(ch) | "-" : s := minus; DevCPM.Get(ch) | "." : DevCPM.Get(ch); IF ch = "." THEN DevCPM.Get(ch); s := upto ELSE s := period END | "/" : s := slash; DevCPM.Get(ch) | "0".."9": Number; s := number | ":" : DevCPM.Get(ch); IF ch = "=" THEN DevCPM.Get(ch); s := becomes ELSE s := colon END | ";" : s := semicolon; DevCPM.Get(ch) | "<" : DevCPM.Get(ch); IF ch = "=" THEN DevCPM.Get(ch); s := leq ELSE s := lss END | "=" : s := eql; DevCPM.Get(ch) | ">" : DevCPM.Get(ch); IF ch = "=" THEN DevCPM.Get(ch); s := geq ELSE s := gtr END | "A": Identifier(s); IF name = "ARRAY" THEN s := array END | "B": Identifier(s); IF name = "BEGIN" THEN s := begin ELSIF name = "BY" THEN s := by END | "C": Identifier(s); IF name = "CASE" THEN s := case ELSIF name = "CONST" THEN s := const ELSIF name = "CLOSE" THEN s := close END | "D": Identifier(s); IF name = "DO" THEN s := do ELSIF name = "DIV" THEN s := div END | "E": Identifier(s); IF name = "END" THEN s := end ELSIF name = "ELSE" THEN s := else ELSIF name = "ELSIF" THEN s := elsif ELSIF name = "EXIT" THEN s := exit END | "F": Identifier(s); IF name = "FOR" THEN s := for END | "I": Identifier(s); IF name = "IF" THEN s := if ELSIF name = "IN" THEN s := in ELSIF name = "IS" THEN s := is ELSIF name = "IMPORT" THEN s := import END | "L": Identifier(s); IF name = "LOOP" THEN s := loop END | "M": Identifier(s); IF name = "MOD" THEN s := mod ELSIF name = "MODULE" THEN s := module END | "N": Identifier(s); IF name = "NIL" THEN s := nil END | "O": Identifier(s); IF name = "OR" THEN s := or ELSIF name = "OF" THEN s := of ELSIF name = "OUT" THEN s := out END | "P": Identifier(s); IF name = "PROCEDURE" THEN s := procedure ELSIF name = "POINTER" THEN s := pointer END | "R": Identifier(s); IF name = "RECORD" THEN s := record ELSIF name = "REPEAT" THEN s := repeat ELSIF name = "RETURN" THEN s := return END | "T": Identifier(s); IF name = "THEN" THEN s := then ELSIF name = "TO" THEN s := to ELSIF name = "TYPE" THEN s := type END | "U": Identifier(s); IF name = "UNTIL" THEN s := until END | "V": Identifier(s); IF name = "VAR" THEN s := var END | "W": Identifier(s); IF name = "WHILE" THEN s := while ELSIF name = "WITH" THEN s := with END | "G".."H", "J", "K", "Q", "S", "X".."Z", "a".."z", "_", "А".."я", "ё", "Ё": Identifier(s) | "[" : s := lbrak; DevCPM.Get(ch) | "]" : s := rbrak; DevCPM.Get(ch) | "^" : s := arrow; DevCPM.Get(ch) | "$" : s := dollar; DevCPM.Get(ch) | "{" : s := lbrace; DevCPM.Get(ch); | "|" : s := bar; DevCPM.Get(ch) | "}" : s := rbrace; DevCPM.Get(ch) | "~" : s := not; DevCPM.Get(ch) | 7FX : s := upto; DevCPM.Get(ch) ELSE s := null; DevCPM.Get(ch) END ; sym := s END Get; PROCEDURE Init*; BEGIN ch := " " END Init; END DevCPS.
Поделиться410-02-2009 13:35:04
http://forum.oberoncore.ru/viewtopic.php?f=3&t=1339 - ветка на Оберонкоре - обсуждающая возможную русификацию ББ
Для начала вопрос: в тексте процедуры DevCPS.Get.
..... | "I": Identifier(s); IF name = "IF" THEN s := if .... достаточно ли исправить на (добавить синоним IF -> ЕСЛИ) .... | "I": Identifier(s); IF (name = "IF") OR (name = "ЕСЛИ") THEN s := if ....
для корректной работы компилятора?
Только в том случае, если у вас слово "ЕСЛИ" будет начинаться на букву "I". Также см. процедуру Identifier для выяснения, какие буквы приемлемы в идентификаторах. В целом копаете в правильном направлении.
Поделиться510-02-2009 13:57:41
Очевидно необходимо:
| "I": Identifier(s); IF name = "IF" THEN s := if
....
заменить на:
.... | "I": Identifier(s); IF name = "IF" THEN s := if | "Е": Identifier(s); IF name = "ЕСЛИ" THEN s := if
....
Судя по этой строке с кириличискими операторами проблем быть не должно?
| "G".."H", "J", "K", "Q", "S", "X".."Z", "a".."z", "_", "А".."я", "ё", "Ё": Identifier(s)
---
PROCEDURE Identifier(VAR sym: BYTE); VAR i: SHORTINT; BEGIN i := 0; REPEAT name[i] := ch; INC(i); DevCPM.Get(ch) UNTIL ~National.IsIdentChar(ch) OR (i = MaxIdLen); IF i = MaxIdLen THEN err(240); DEC(i) END ; name[i] := 0X; sym := ident END Identifier;
--------------------
Честно говоря ничего не понял?? что делает эта процедура?
Поделиться615-02-2009 09:30:51
Потому что из текста слов не выкинешь. Она для своей работы использует другие процедуры и функции, а также глобальный (по отношению к данной процедуре) массив name[].
Я так понял, что в name[] формируется имя оператора, а входящий параметр Sym - возвращает его идентификатор (предположительно первый символ). На это указывает и тот факт, что Sym объявлен как Var, это означает, что параметр может быть изменен во время работы процедуры. Логично предположить, что поскольку процедура явных преобразований не выполняет и вызывает только процедуры, а не функции, то она для возвращения результата использует Sym. Вообще не имея исходников, рассуждать на такие темы довольно-таки трудно. Не могли бы вы дать линк на исходные тексты?
Касательно имени в name[], он использует для завершения символ 0, что в принципе является стандартом.
Поделиться711-03-2009 13:29:06
на сайте оберон коре - в разделе "скачать /загрузка"
blackbox15re026.exe сам Русский БлэкБокс 1.5
+ сервис пак для него 4,02 - bb_sp401.exe
доступно всё в исходниках, описание на русском - вообще идеальный проект для русификации... есть визуальная среда
http://oberoncore.ru/blackbox/environment - ссылка
Отредактировано rusprog (12-03-2009 09:54:04)
Поделиться812-03-2009 11:09:59
http://forum.oberoncore.ru/viewtopic.php?f=7&t=1392 - русификация ББ с помощю прарсера