OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 16 Август, 2018 00:02

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 04 Февраль, 2009 20:02 

Зарегистрирован: Среда, 04 Февраль, 2009 19:03
Сообщения: 25
Есть желание при обучении программированию детей в школе использовать русский язык. Для обучения естественно желательно использовать современный язык с современной концепцией, чтобы привить хороший стиль программирования. Да и вообще я считаю что наши дети ничем не хуже американских и должны иметь возможность учится программировать на родном языке. В общем, хотелось бы добавить в БлэкБокс возможность использования параллельно с английскими - и русские конструкции ЕСЛИ ТО ИНАЧЕ. Насколько я понял
это можно сделать в Процедуре DevCPS.Get. Я не очень хорошо разбираюсь в компиляторах. поэтому ищу тех кто сможет помочь реализовать это возможность или хотя бы проконсультирует как это сделать.

Для начала вопрос: в тексте процедуры DevCPS.Get.
.....
| "I": Identifier(s); IF name = "IF" THEN s := if
....
достаточно ли исправить на (добавить синоним IF -> ЕСЛИ)
....
| "I": Identifier(s); IF name = "IF" OR "ЕСЛИ" THEN s := if
....
для корректной работы компилятора


PS В качестве встроенного редактора блок-схем есть желание использовать Дракон-редактор.

Сайт проекта -> http://rus.24bb.ru - Языки программирования с русским синтаксисом - раздел "БлэкБокс (Компонентный Паскаль)" или в этой ветке.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Февраль, 2009 21:09 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2289
Откуда: Россия, Санкт-Петербург
rus.24bb.ru писал(а):
Для начала вопрос: в тексте процедуры 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 для выяснения, какие буквы приемлемы в идентификаторах. В целом копаете в правильном направлении.
Для знакомства с устройством компилятора можно почитать "Compiler Construction" Вирта.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 04 Февраль, 2009 21:20 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8970
Откуда: Россия, Орёл
Вообще, ещё надо документацию на OP2 Compiler. Где-то она болталась у нас тут?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Февраль, 2009 07:20 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
rus.24bb.ru писал(а):
Есть желание при обучении программированию детей в школе использовать русский язык.

http://glagol.nad.ru/
http://dic.academic.ru/dic.nsf/ruwiki/106869


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 10 Февраль, 2009 13:30 

Зарегистрирован: Среда, 04 Февраль, 2009 19:03
Сообщения: 25
Большое спасибо за советы, по Глагол я знаю, но мне не нравится:
1. Сокращённый синтаксис ЦЕЛ вместо Целый и т.п.
2. Отдел вместо процедура и т.п.
3. нет редактора под windows, редактора форм
Хочется нормальный современный язык , а не игрушечный.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 10 Февраль, 2009 13:38 

Зарегистрирован: Среда, 04 Февраль, 2009 19:03
Сообщения: 25
Александр Ильин писал(а):
rus.24bb.ru писал(а):
Для начала вопрос: в тексте процедуры 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 для выяснения, какие буквы приемлемы в идентификаторах. В целом копаете в правильном направлении.

что то я действительно сглупил д.б. примерно:
....
| "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;
--------------------
Честно говоря ничего не понял?? что делает эта процедура??


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 10 Февраль, 2009 14:03 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1328
rus.24bb.ru писал(а):
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;
--------------------
(Скорее всего - считывается идентификатор.)
Честно говоря ничего не понял?? что делает эта процедура??

Заполняет из источника букафф некую строку до максимальной длины MaxIdLen и пока это - разрешённая для идентификаторов буква.
Если длина идентификатора больше предопределённого реализацией (MaxIdLen), то он обрезается до этой длины (с фиксацией ошибки где-то).
Результат возвращается в sym
Внешний name скорее всего или статически объявленный или где-то заранее NEWed...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Февраль, 2009 14:06 

Зарегистрирован: Среда, 04 Февраль, 2009 19:03
Сообщения: 25
А если вообще исключить проверку на соответствие символов?
~National.IsIdentChar(ch)
и оставить так:
UNTIL (i = MaxIdLen);
Решение конечно кривое но, работать будет??

откуда это
~National.IsIdentChar(ch) ???


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Февраль, 2009 14:40 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
Код:
UNTIL (i = MaxIdLen);
IF i = MaxIdLen THEN err(240); DEC(i) END ;
Работать будет. Вот так:
Код:
UNTIL (i = MaxIdLen);
err(240); DEC(i);
Кажется, Вам стоит чуток отложить переделку компилятора....


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Февраль, 2009 15:48 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1328
rus.24bb.ru писал(а):
А если ... , работать будет??

Скорее - функционировать...

rus.24bb.ru писал(а):
откуда это
~National.IsIdentChar(ch) ???

Не понял вопроса!
А!... Вы, вероятно, - Си-шник !? :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Февраль, 2009 19:36 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7834
Откуда: Троицк, Москва
Компилятор трогать не стоит.
В Блэкбоксе достаточно сделать новую команду, которая:

-- ловит компилируемый текст с русскими ключ. словами;
-- проходит по нему, создавая другой текст, в котором русские ключевые слова заменяются на английские, при этом строится некий список позиций соответствующих слов в русском и английском варианте;
-- к переведенному тексту с англ. ключ. словами применяется обычная компиляция; при этом компилятор вставляет туда маркеры ошибок (вьюшки);
-- проходом по этому англ. тексту из него извлекаются маркеры ошибок и, используя ранее сгенеренный список соответствий, вставляются в исходный русский текст, видимый школьнику.

Почти все необходимые зацепки с каркасом ББ показаны в модуле Info21sysEdit (где делаются раскрытия конструкций по F5).

Я бы не стал сразу лезть в компилятор (хрупкая вещь), а сначала реализовал именно этот достаточно простой и, главное, надежный способ (отлаживать легко: сразу всё будет видно по положению маркеров ошибок).
А дальше видно будет.
Если оно пойдет в массовом масштабе и будет тормозить неприемлемо -- из народа наверняка выйдет юный герой подраконить компилятор: такого рода неконцептуальные задачки решаются народом быстро.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 11 Февраль, 2009 19:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8970
Откуда: Россия, Орёл
Да с чего бы тормозить - ерунда :) Отличнейшим образом будет работать.
(В Lab-е ведь таким образом и было сделано - и маркеры ошибок ловились, и ссылки трепа корректировались).

Хотя, если подумать, как проще - то если русские ключевые будут все длиннее английских аналогов, то достаточно просто добивать в скармливаемый компилятору текст пробелы - и не нужно ничего корректировать в позициях маркеров и трепов..


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 12 Февраль, 2009 01:51 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
rus.24bb.ru писал(а):
откуда это
~National.IsIdentChar(ch) ???

Это как раз позволяет использовать русские буквы в идентификаторах. В оригинале было так:
Код:
   PROCEDURE Identifier(VAR sym: BYTE);
      VAR i: SHORTINT;
   BEGIN i := 0;
      REPEAT
         name[i] := ch; INC(i); DevCPM.Get(ch)
      UNTIL (ch < "0")
         OR ("9" < ch) & (CAP(ch) < "A")
         OR ("Z" < CAP(ch)) & (ch # "_") & (ch < "À")
         OR (ch = "×")
         OR (ch = "÷")
         OR (i = MaxIdLen);
      IF i = MaxIdLen THEN err(240); DEC(i) END ;
      name[i] := 0X; sym := ident
   END Identifier;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 19 Март, 2009 14:54 

Зарегистрирован: Среда, 04 Февраль, 2009 19:03
Сообщения: 25
Info21 писал(а):
Компилятор трогать не стоит.
В Блэкбоксе достаточно сделать новую команду, которая:

-- ловит компилируемый текст с русскими ключ. словами;
-- проходит по нему, создавая другой текст, в котором русские ключевые слова заменяются на английские, при этом строится некий список позиций соответствующих слов в русском и английском варианте;
-- к переведенному тексту с англ. ключ. словами применяется обычная компиляция; при этом компилятор вставляет туда маркеры ошибок (вьюшки);
-- проходом по этому англ. тексту из него извлекаются маркеры ошибок и, используя ранее сгенеренный список соответствий, вставляются в исходный русский текст, видимый школьнику.

Почти все необходимые зацепки с каркасом ББ показаны в модуле Info21sysEdit (где делаются раскрытия конструкций по F5).

http://rus.24bb.ru/viewtopic.php?pid=488#p488 - обсуждение реализации этой идеи.(Спасибо info21)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2018, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB