Dilma писал(а):
есть такое дело. Последствия исполнения на лету...
Ну вот... Зря я что ли ДРАКОНА читал - посмотрим, проверим...
Не настолько там и не прозрачно все
[size=-2]------ Добавлено в 13:53
tsdima писал(а):
Трансляцию надо делать один раз, а потом выполнять дерево программы, т.е. каждый узел дерева должен иметь виртуальную функцию Calc(context_list), выполняющую соответствующую узлу функцию, вызывая при необходимости аналогичную функцию под-узлов.
А вот не все так просто, как ты рассказываешь
1) Вообще-то, у нас не совсем дерево. А в общем случае - совсем не дерево. Ex-ы и DPE-точки превращают дерево в граф (ДАГ - по научному).
А если еще и "кольцевания" есть, то в циклический граф. А ты, помнится, еще и примеры "неприводимых" выкладывал
2) Одной ф-ии
Calc(context_list) не фига недостаточно для уважаемых всеми вариантов трансляции.
Букварь называет результат вызова аналогичной ф-ии - синтаксическим аттрибутом. Результирующий код - это такой аттрибут, и вроде бы кроме него нам ничего нафиг и не надо.
НО, беда в том, что такая ф-ия имеет, как правило, входные параметры.
Которые букварь (не я) называет уже наследуемыми аттрибутами.
Где его (входной параметр) взять ???
Выполнить какую-то другую ф-ию, для которой он уже будет синтаксическим. А у ней в свою очередь могут оказаться наследуемые...
И т.д., в общем
В скриптовых языках все эти необходимые ф-ии, и порядок их вызова определяются на этапе конструирования компилятора, и закладываются в некие правила раскрытия "нетерминала"
На узле дерева - грубо говоря...
Более приземленно: чтобы сконструировать код элемента Memory (к примеру) нам же надо знать тип данных, которые он (Memory) будет хранить. Этот тип должен пойти на вход той самой ф-ии, которая сделает код (у нас это скрипт метода элемента). А чтобы разумно (а не с потолка) сказать какой тип нужен, не плохо бы знать кто и чего просит от этого элемента.
В "классике" это означало бы необходимость ф-ии, которая не код возвращает, а этот тип...
Вот я вчера примерчик приводил...
Add(Button,2600237,161,56)
{
Left=20
Top=20
Caption="2"
Data=String(ФФФ)
link(onClick,6056868:doEvent1,[])
}
Add(Button,16372707,161,126)
{
Left=20
Top=55
Caption="1"
Data=Integer(111)
link(onClick,72255:doEvent1,[])
}
Add(Memory,12744181,364,63)
{
}
Add(HubEx,7214230,322,56)
{
link(onEvent,12744181:doValue,[])
}
Add(Hub,6056868,231,56)
{
link(onEvent1,2361893:doStrCat,[(334,62)(334,139)])
link(onEvent2,7214230:doWork2,[])
}
Add(Hub,72255,231,126)
{
link(onEvent1,10819280:doStrCat,[])
link(onEvent2,7214230:doWork3,[(326,139)])
}
Add(StrCat,10819280,357,126)
{
Str1="Перед первым: "
link(onStrCat,9836160:doWork2,[])
link(Str2,12769590:Var2,[])
}
Add(HubEx,9836160,455,119)
{
link(onEvent,15475207:doText,[])
}
Add(GetDataEx,12769590,357,105)
{
link(Data,12744181:Value,[])
}
Add(Label,15475207,497,126)
{
Left=20
Top=95
Width=255
Height=20
Color=12632256
AutoSize=1
Alignment=2
}
Add(StrCat,2361893,399,133)
{
Str1="Перед вторым: "
link(onStrCat,9836160:doWork3,[(459,139)])
link(Str2,12769590:Var3,[(412,114)])
}
Так в ём, тип данных у элемента Memory вроде string быть должен
Как догадался
рассуждал "с конца"