DRAKON.SU
https://forum.drakon.su/

Пример алгоритма на ДРАКОНе
https://forum.drakon.su/viewtopic.php?f=178&t=957
Страница 1 из 4

Автор:  Александр Ильин [ Пятница, 18 Апрель, 2008 16:38 ]
Заголовок сообщения:  Пример алгоритма на ДРАКОНе

Надо было мне продумать алгоритм, и я решил нарисовать его с помощью редактора Геннадия Тышова.
Можно порассуждать о том, насколько понятно получилось. Признаю, что текст, написанный на языке программирования вместо русского, читать сложнее. А как в остальном эргономика? Трудно ли понять и проверить правильность алгоритма? Приглашаю всех попробовать найти ошибку в алгоритме и поделиться впечатлениями. : )
Вложение:
Комментарий к файлу: Схема (убрать расширение .odc)
парсер.drt.odc [8.62 КБ]
Скачиваний: 955

Вложение:
Комментарий к файлу: Та же схема
парсер.png
парсер.png [ 44.4 КБ | Просмотров: 26892 ]

Во время работы с редактором замечены некоторые недостатки:
- перемещение схем по листу (стрелочками клавиатуры) не делает доступной кнопку сохранения документа;
- при добавлении нового элемента программа не предлагает написать в него текст, даже если установлена галочка "Эл.". Необходимо выполнить дополнительный щелчок левой кнопкой мыши по вновь добавленному элементу, затем щелчок по полю ввода, затем выделить непонятно откуда взявшийся текст вида "///-114" и только после этого можно написать то, ради чего создан элемент. Удобно было бы сразу отобразить и активировать поле ввода. Более того, если элемент вновь создан, то можно сразу выделить текст "///-114", чтобы ввод пользователя заменил этот текст на нужный.

Автор:  Info21 [ Пятница, 18 Апрель, 2008 17:03 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Так чем это лучше, чем хорошо форматированный текст на Обероне?

Автор:  Vlad [ Пятница, 18 Апрель, 2008 19:40 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Александр Ильин писал(а):
Надо было мне продумать алгоритм, и я решил нарисовать его с помощью редактора Геннадия Тышова.


Ужас :) Такой результат я бы не стал использовать для демонстрации достижений визуальных языков :) Конкретно эта программа на традиционном языке будет выглядеть намного понятнее. Хотя с асмом и можно посоревноваться :)

Автор:  Александр Ильин [ Пятница, 18 Апрель, 2008 20:32 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Перевожу сейчас этот алгоритм в текст на Обероне. Столкнулся с некоторыми трудностями, не всё гладко переводится. Например, в процедуре GetIdent цикл с двумя выходами. Не в том смысле, что из двух мест выход, а В ДВЕ ВЕТКИ алгоритма выход. Мне пришлось из-за этого продублировать условие "i >= 0":
Код:
PROCEDURE GetIdent (r: Reader; VAR id: IdentDesc);
VAR i, lastInd: LONGINT;
BEGIN
   lastInd := LEN (id.name) - 1;
   i := lastInd;
   WHILE (i >= 0) & IdentChar (r.ch) DO
      id.name [i] := r.ch;
      DEC (i);
      IF i >= 0 THEN
         r.ReadPrev
      END
   END;
   IF (i >= 0) & (i < lastInd) & IdentFirstChar (id.name [i + 1]) THEN
      MoveBlock (id.name, i + 1, lastInd - i, 0);
      id.name [lastInd - i] := 0X
   ELSE
      id.name [0] := 0X
   END
END GetIdent;
Получается, что ДРАКОН в данном случае позволил мне составить более компактный алгоритм, без лишнего повтора проверки. Отсутствие дубля означает, что логическая структура алгоритма отражена более точно.

Автор:  Илья Ермаков [ Пятница, 18 Апрель, 2008 20:50 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Да, естественно - некоторые Драконовские конфигурации просто так на операторный язык не ложатся.
Операторами гораздо громоздчее получается... :-)

Однако пример действительно неудачный.
Это ж типичная автоматная задачка. Здесь бы как раз Драконом и развернуться от души :-)

Что я и сделал. Часть логики предполагается в "умном" типе Ident (накопление символов, проверка длины идентификатора и допустимого первого символа). Т.е. "подавтомат" (его не рисовал, т.к. тривиально).

Вложения:
Ilyin.JPG
Ilyin.JPG [ 219.31 КБ | Просмотров: 26865 ]

Автор:  Илья Ермаков [ Пятница, 18 Апрель, 2008 21:00 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

По редактору: действительно, проблемы у него есть, хотя для забав пока сойдёт :-) И кроме удобства. Например, позиции элементов не сохраняются (не могу выровнять операторы в разных ветках отн. друг друга - всё равно сбрасываются). В целом, ведёт себя как настоящий... Микрософт Ворд прямо какой-то... (в смысле, с глубокой внутренней логикой думания, недоступной прямолинейно мыслящему юзеру) :-)

Теперь в целом касательно представления схем, что бросилось в глаза сразу на примере примера Александра :-)

Линии слишком жирные, текст бледный на их фоне - хотя должно быть наоборот.
Вызов процедур лучше оформлять значком для "подалгоритма".
Независимые действия типа INC(from); INC(to); INC(len) хорошо бы группировать в одном знаке.
Т.к. их порядок выполнения неважен, просто одним шагом...

И касательно самой задачки типа извлечения идентификаторов...
Их бы делать на основе синт. дерева компилятора... Чтобы руками не ваять каждый самопальный частичный разбор, который всё равно не учитывает всех ситуаций...
Короче, аналога ASIS хочется :-) (эк, размечтался... Особенно для закрытого XDS, на котором Александр работает).

Автор:  Александр Ильин [ Пятница, 18 Апрель, 2008 21:27 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Илья Ермаков писал(а):
И касательно самой задачки типа извлечения идентификаторов...
Их бы делать на основе синт. дерева компилятора... Чтобы руками не ваять каждый самопальный частичный разбор, который всё равно не учитывает всех ситуаций...
Короче, аналога ASIS хочется :-) (эк, размечтался... Особенно для закрытого XDS, на котором Александр работает).
Закрытость XDS - не проблема. Просто я пока не ставил перед собой задачу разобраться с синтаксическими деревьями компиляторов, а решил сгородить временное решение на своём текущем уровне знаний.

А что такое ASIS? Гугл слишком много ссылок дал.

Автор:  Илья Ермаков [ Пятница, 18 Апрель, 2008 21:34 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Ada Semantic Interface Specification.
Для Ады стандартизирован интерфейс библиотеки для доступа ко всей информации о разобранной программе.
Т.е. инструментам разного рода уже не нужно самостоятельно перемалывать исходник.

Изначально разработан компанией AdaCore, разработчик - наш соотечественник С.И. Рыбин, из НИИВЦ МГУ.

Автор:  ==== [ Пятница, 18 Апрель, 2008 21:42 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Александр Ильин писал(а):
Получается, что ДРАКОН в данном случае позволил мне составить более компактный алгоритм, без лишнего повтора проверки. Отсутствие дубля означает, что логическая структура алгоритма отражена более точно.

Вложение:
.JPG

Вы успешно осваиваите Дракон-редактор. Надо освоить объединение линий, икона
"Конец" должна находится на одной вертикале (шампуре) с заголовком.
Ссылка на каталог Дракон-редактора, можно будет просмотреть процесс формирования схемы.
http://narod.ru/disk/124663000/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%98%D0%BD%D0%B0%D1%87%D0%B5.rar
Архивированный каталог со всем содержимым больше 250 Кбайт, потому и помещаю на НАРОДЕ

Сообщение поправлено администратором. Пример с Народа размещён ниже.

Автор:  Александр Ильин [ Пятница, 18 Апрель, 2008 22:15 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Геннадий Тышов писал(а):
Надо освоить объединение линий, икона "Конец" должна находится на одной вертикале (шампуре) с заголовком.
Спасибо за ваш вариант!
И за то, что напоминаете правила, - я так и не удосужился их как следует изучить.

PS: Когда пишете сообщение на форум, ниже кнопки "Отправить" есть поле "Имя файла" и кнопка "Choose..." (= "Выбрать...") рядом. Так я прикрепляю картинки (и прочие файлы) прямо к сообщению. Ограничение на размер файла - 250 килобайт.

Автор:  Vlad [ Пятница, 18 Апрель, 2008 22:19 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Илья Ермаков писал(а):
Что я и сделал.


О! Совсем другое дело. Хотя я и не изучал Дракон. Мне кажется, что главное отличие - видимая структура.

Автор:  Илья Ермаков [ Пятница, 18 Апрель, 2008 22:21 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Ага. Структура отображается родным для неё образом - ГРАФически. А в узлах графа - семантика :-)

В общем, можно сказать, что Дракон - это автоматное программирование.
Но Дракон позволяет без выкрутасов выражать и обычный алгоритм ("неосновные состояния" в терминах Шалыто, которые они записывают на обычном языке программирования).
Т.е. структурно-автоматный язык.

Автор:  ==== [ Пятница, 18 Апрель, 2008 23:31 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Илья Ермаков от 18.04.2008 21:50 писал(а):
Это ж типичная автоматная задачка. Здесь бы как раз Драконом и развернуться от души :-)
К вопросу программирования схемы Силуэт в КП:
Код:
PROCEDURE ИмяСилуэт(IN ИмяВетки:ARRAY OF CHAR;.......);
BEGIN
  LOOP    (*Цикл Силуэта*) 
    IF ИмяВетки$="Ветка_1" THEN    (* Для константы используются текст или его фрагмент иконки "Ветка"*)
       .................
       ИмяВетки:="Ветка_2"        (*Переход на другую ветку*)
    ELSEIF ИмяВетки$="Ветка_2" THEN  (*Ветка с 2 адресами*)
       IF Условие THEN                   
         .................
         ИмяВетки:="Ветка_1"      (*Веточный цикл, т.е. переход на ранее описанную ветку*)
       ELSE
         .................
         ИмяВетки:="Ветка_3"
       END
    ELSEIF ИмяВетки$="Ветка_3" THEN (* Последняя ветка с иконкой "Конец"*)
       .................
       EXIT    (*Иконка "Конец"*)
    END 
  END
END ИмяСилуэт
 
ИмяСилуэт("Ветка_1", .........);  (*Вызов процедуры со входом в 1-ю ветку*)
Для Силуэта с несколькими Заголовками, могут вызываться другие ветки.

Автор:  Info21 [ Пятница, 18 Апрель, 2008 23:49 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Александр Ильин писал(а):
Перевожу сейчас этот алгоритм в текст на Обероне. ...


Прошу прощения, но процедура вызывает подозрения... не нравится мне цикл, первая проверка лишняя? ... что-то не то. Вероятно, дело в том, как процедура "вырезана" из контекста... но проверять сил нет.

Автор:  Александр Ильин [ Суббота, 19 Апрель, 2008 00:44 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Info21 писал(а):
Прошу прощения, но процедура вызывает подозрения... не нравится мне цикл, первая проверка лишняя?
Первая половина условия на первой итерации всегда выполняется, поэтому можно переписать так:
Код:
   (* было: *)
   WHILE (i >= 0) & IdentChar (r.ch) DO
      id.name [i] := r.ch;
      DEC (i);
      IF i >= 0 THEN
         r.ReadPrev
      END
   END;
   (* стало: *)
   IF IdentChar (r.ch) THEN
      REPEAT
         id.name [i] := r.ch;
         DEC (i);
         IF i >= 0 THEN
            r.ReadPrev
         END
      UNTIL ~(i >= 0) OR ~IdentChar (r.ch)
   END
Убрать дубль проверки "i >= 0" можно, если добавить переменную done: BOOLEAN:
Код:
   IF IdentChar (r.ch) THEN
      done := FALSE;
      REPEAT
         id.name [i] := r.ch;
         DEC (i);
         IF i >= 0 THEN
            r.ReadPrev;
            done := ~IdentChar (r.ch)
         ELSE
            done := TRUE
         END
      UNTIL done
   END
Просто так более громоздко, да и переменная дополнительная, а сэкономили чуть.

Автор:  ==== [ Суббота, 19 Апрель, 2008 07:08 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Александр Ильин писал(а):
Надо было мне продумать алгоритм, и я решил нарисовать его с помощью редактора Геннадия Тышова.

Извените при просмотре, в результате каких то действий с моей стороны, изображение исчезло, появилось .png . Прошу восстановить.
Предлагаю в сообщениях прикреплять выходной файл дракон-редактора (.drt). Можно будет и просмотреть и внести предлагаемые изменения.

Автор:  ==== [ Суббота, 19 Апрель, 2008 07:09 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Геннадий Тышов писал(а):
Александр Ильин писал(а):
Надо было мне продумать алгоритм, и я решил нарисовать его с помощью редактора Геннадия Тышова.

Извините, при просмотре, в результате каких то действий с моей стороны, изображение исчезло, появилось .png . Прошу восстановить.
Предлагаю в сообщениях прикреплять выходной файл дракон-редактора (.drt). Можно будет и просмотреть и внести предлагаемые изменения.

Автор:  Александр Ильин [ Суббота, 19 Апрель, 2008 08:59 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Геннадий Тышов писал(а):
Извените при просмотре, в результате каких то действий с моей стороны, изображение исчезло, появилось .png. Прошу восстановить.
Скорее всего, вы отключили показ картинок в своём браузере. На сервере вы ничего поломать не могли.
Геннадий Тышов писал(а):
Предлагаю в сообщениях прикреплять выходной файл дракон-редактора (.drt). Можно будет и просмотреть и внести предлагаемые изменения.
Хорошая мысль! Прикрепил файл к первому сообщению.

Автор:  ==== [ Суббота, 19 Апрель, 2008 10:08 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Александр Ильин писал(а):
Хорошая мысль! Прикрепил файл к первому сообщению.

Ваш файл изменил:
1. Соседние иконки "Действия" заменил одной.
2. Выполнил объединения соседних линий, имеющих соединение, в одну. Для этого выбирается узел на 1-й линий и соединении, операция "Узел: объединить линии", выбирается узел на 2-й линии и соединении. Возможно образуется наложение линий и элементов, устранить соответствующим сдвигом элементов и узлов. Для этого выбрать элемент или узел, сдвинуть Ctrl+стрелки.
3. Выполнение алгоритма производится только по шампуру т.е. вниз по вертикали, исключение выход вправо из "Вопроса".
Скачать:http://forum.oberoncore.ru/download/file.php?mode=view&id=116
Для вложенных файлов не допускается расширение .drt , можно ли разрешить.

Автор:  Axcel [ Суббота, 19 Апрель, 2008 13:27 ]
Заголовок сообщения:  Re: Пример алгоритма на ДРАКОНе

Честно говоря, ни один из вариантов схем меня совершенно не вдохновил. Как-то все не очень понятно. Что касается цикла, может лучше так?
Код:
   IF IdentChar (r.ch) THEN
      LOOP
         id.name [i] := r.ch;
         DEC (i);
         IF (i >= 0)&(IdentChar (r.ch)) THEN
            r.ReadPrev
         END
         ELSE EXIT END
       END
   END

Страница 1 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/