Пишет Роман Мишин.
Романа занимается программирование на языке Tcl, привлекает для этого ИС Дракон.
Так как Tcl не содержит оператор Goto, приходится найти возможность обойти ограничение в ИС Дракон.
В дополнение к первому письму поступили новые письма с решением возникающих проблем.
В деталях, я не смог разобраться и выкладываю письма Романа здесь, по предложению Романа.
Готовое решение для Tcl
От кого: Roman Mishin
Кому: Геннадий Тышов
Сегодня, 13:31
Геннадий,
В общем, всё отлично работает - все переходы.
Вы на форуме продублировали часть моего письма про Tcl. В там описаном виде решение не работает.
Вот как я сейчас генерирую:
Текст иконы модуля:
FileTime.tcl
FileTime.drt
Tcl.lpr
Р-текст иконы модуля:
Код:
namespace eval ::ModuleName {
;# здесь можно поместить определение общих процедур
;# каких-нибудь простых, для которых схема не нужна
====
} ;# namespace ::ModuleName
::ModuleName::main
Р-текст схемы силуэт или примитив:
Код:
proc main {} {
array set machine {
state0 {
====
exit -1}
}
set state state0
while {1} {eval $machine($state)}
}
# здесь exit -1 это аварийный выход, до него дело не должно доходить
# где-то в схеме должны быть явные exit или return с нужным кодом
Содержимое файла Tcl.lpr:
Код:
[Operator]
Name=Tcl
Comment=;# <Comment/>
Label=} state<NN/> {
Goto=set state state<NN/> ; continue
YesGoto=if { <Usl/> } { set state state<NN/> ; continue }
NotGoto=if { ! ( <Usl/> ) } { set state state<NN/> ; continue }
Это всё, что нужно определить в ИС Дракон, но этого не достаточно, чтобы запустить код, потому что некоторые переходы (как я обсуждал в прошлых письмах) - отсутствуют.
Задача могла бы быть решена простой заменой в файле Tcl.lpr:
Label=} state<NN/> {
на
Label=set state state<NN/> ; continue } state<NN/> {
но ИС Дракон не замещает второе вхождение <NN/> и поэтому результирующий код нерабочий:
set state state36 ; continue } state<NN/> {
Для того, чтобы получить таки рабочий код я делаю последобработку генерируемого файла, которую автоматически запускаю из Dragon.bat
Я заменяю метки вида:
} state36 {
на метки вида:
set state state36 ; continue
} state36 {
таким образом выполняя явный переход на каждый следующий шаг.
Всё - файл рабочий.
Для пущей красоты я ещё убираю лишние переходы:
...
set state state42 ; continue
set state state34 ; continue
} state34 {
...
преобразую в:
...
set state state42 ; continue
} state34 {
...
но это уже не важно для компилятора - я делаю это просто, потому что это не трудно.
Геннадий, если вы не против, то поправьте или дополните то сообщение на форуме.
В целом это рабочее решение для Tcl.
--
Роман Мишин