Языки программирования с русским синтаксисом

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Русификация BlackBox

Сообщений 1 страница 8 из 8

1

BlackBox очень подходит для русификации по следующим причинам:
1. Лицензия GPL
2. Современная очень удачная архитектура (компонентно- ориентированное программирование), простое, мощное и безопасное решение, хорошо проработанное.
3. Язык программирования - КомпонентныйПаскаль - близок к Delphi - широко распространённому в бСССР
4. Есть среда визуального программирования и IDE
5. Есть частично русифицированные версии BB1.6
6. Есть большая группа русскоязычных пользователей обладающих высокой квалификацией

0

2

Может подскажете (кто знает в каком месте в исходных кодах БлэкБокс1.5 sp4.01 Рус) можно добавить или как сделать замену синонимов операторов IF THEN ELSE на ЕСЛИ ТО ИНАЧЕ (чтобы компилятор перед компиляцией заменял ЕСЛИ ТО ИНАЧЕ на IF THEN ELSE и таким образом переваривал и русские и английские операторы - очень хочется такое сделать сильно помогает пониманию/обучению)

Процедура DevCPS.Get. (в файле... Dev/Mod/CPS.odc для версии Блэкбокс1.5 sp4.01  Рус)

0

3

Вот этот кусок кода насколько я понял???

Код:
	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.

0

4

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 для выяснения, какие буквы приемлемы в идентификаторах. В целом копаете в правильном направлении.

0

5

Очевидно необходимо:

Код:
| "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;

--------------------
Честно говоря ничего не понял?? что делает эта процедура?

0

6

Потому что из текста слов не выкинешь. Она для своей работы использует другие процедуры и функции, а также глобальный (по отношению к данной процедуре) массив name[].
Я так понял, что в name[] формируется имя оператора, а входящий параметр Sym - возвращает его идентификатор (предположительно первый символ). На это указывает и тот факт, что Sym объявлен как Var, это означает, что параметр может быть изменен во время работы процедуры. Логично предположить, что поскольку процедура явных преобразований не выполняет и вызывает только процедуры, а не функции, то она для возвращения результата использует Sym. Вообще не имея исходников, рассуждать на такие темы довольно-таки трудно. Не могли бы вы дать линк на исходные тексты?
Касательно имени в name[], он использует для завершения символ 0, что в принципе является стандартом.

0

7

на сайте оберон коре - в разделе "скачать /загрузка"

blackbox15re026.exe  сам Русский БлэкБокс 1.5
+ сервис пак для него 4,02  - bb_sp401.exe

доступно всё в исходниках, описание на русском - вообще идеальный проект для русификации... есть визуальная среда

http://oberoncore.ru/blackbox/environment - ссылка

Отредактировано rusprog (12-03-2009 09:54:04)

0

8

http://forum.oberoncore.ru/viewtopic.php?f=7&t=1392 - русификация ББ с помощю прарсера

0