Предыдущая серия была тут - Кодогенерация. Вынесем почти всё во внешние словари.
Теперь вынесем конкретную модель и конкретные шаблоны во внешние словари.
Вот что остаётся:
https://bitbucket.org/lulinalex/mindstream/src/eaf26043070bdd15485c631ba5e2f9b00bf882e2/Examples/Scripts/CodeGeneration/CodeGen69.ms.script?at=B284
А вот дальше мы будем заниматься развитием шаблонов кодогенерации собственно в целевые языки.
Сами шаблоны кодогенерации в целевые языки выглядят пока вот так:
Теперь вынесем конкретную модель и конкретные шаблоны во внешние словари.
Вот что остаётся:
https://bitbucket.org/lulinalex/mindstream/src/eaf26043070bdd15485c631ba5e2f9b00bf882e2/Examples/Scripts/CodeGeneration/CodeGen69.ms.script?at=B284
USES Documentation.ms.dict Object.ms.dict ; Test CodeGen %REMARK ' CodeGen - это функция в которой мы будем тестировать наш функционал ' USES Concrete.ms.model // - подключаем "конкретную модель" ; USES CodeDump.ms.dict // - тут подключаем словарь CodeDump.ms.dict, чтобы "увидеть" слово DumpElement ; this.method.addr DumpElement %REMARK ' - тут дампим элемент CodeGen и его содержимое в стандартное устройство вывода. Чисто для отладки того, что мы сейчас написали. ' USES Generation.ms.dict // - это для того, чтобы подключить CallGensList CommonLang.ms.tpl // - подключаем конкретные шаблоны кодогенерации ; help %REMARK ' Выводим всю доступную аксиоматику в стандартное устройство вывода. Чисто для отладки того, что мы сейчас написали. ' ( Project1 Project2 Project3 ) %REMARK 'Список всех наших корневых элементов (проектов)' ( .dump .pas .c++ .h .script ) %REMARK 'Список всех наших генераторов' CallGensList %REMARK '- запускаем список генераторов на списке "рутовых элементов" модели.' ; // CodeGen CodeGen
А вот дальше мы будем заниматься развитием шаблонов кодогенерации собственно в целевые языки.
Сами шаблоны кодогенерации в целевые языки выглядят пока вот так:
// CommonLang.ms.tpl // Шаблоны генерации для "общепринятых языков" USES Documentation.ms.dict params.ms.dict NoStrangeSymbols.ms.dict arrays.ms.dict ElementsRTTI.ms.dict Generation.ms.dict string.ms.dict ; STRING FUNCTION CatSepIndent> ARRAY right aValues CatSep> cIndentChar aValues =: Result ; // CatSepIndent> elem_proc DumpAsIs %SUMMARY 'Процедура печатающая содержимое элемента модели. Рекурсивно.' ; CatSepIndent> [ Self .Stereotypes .reverted> ==> .Name %REMARK 'Выводим стереотип элемента, рекурсивно' Self .Name %REMARK 'Выводим имя элемента' ] OutToFile 'Родители ' (+)? CatSepIndent> ( Self .Parents .reverted> .map> .Name ) ?OutToFile 'Наследуемые ' (+)? CatSepIndent> ( Self .Inherited .map> .Name ) ?OutToFile 'Реализуемые ' (+)? CatSepIndent> ( Self .Implements .map> .Name ) ?OutToFile Self .generate.children %REMARK 'Выводим детей элемента, тем же самым генератором' [ '; // ' Self .Name ] OutToFile %REMARK 'Выводим закрывающую скобку элемента' ; // DumpAsIs elem_generator dump %SUMMARY 'Генератор выводящий дамп элемента модели.' ; %GEN_PROPERTY Name 'dump' %REMARK 'Имя генератора и расширение файла целевого языка. Потом мы сделаем так, чтобы они могли не совпадать' Self .DumpAsIs %REMARK 'Пока выводим всё "как есть", без трансформации в целевой язык' ; // dump elem_generator pas %SUMMARY 'Генератор выводящий элементы модели в Паскаль.' ; %GEN_PROPERTY Name 'pas' %REMARK 'Имя генератора и расширение файла целевого языка. Потом мы сделаем так, чтобы они могли не совпадать' Self .DumpAsIs %REMARK 'Пока выводим всё "как есть", без трансформации в целевой язык' ; // pas elem_generator script %SUMMARY 'Генератор выводящий элементы модели в ms.script.' ; %GEN_PROPERTY Name 'ms.script' %REMARK 'Имя генератора и расширение файла целевого языка. Потом мы сделаем так, чтобы они могли не совпадать' Self .DumpAsIs %REMARK 'Пока выводим всё "как есть", без трансформации в целевой язык' ; // script elem_generator c++ %SUMMARY ' Генератор выводящий элементы модели в c++. Про файлы *.h мы потом поговорим отдельно. ' ; %GEN_PROPERTY Name 'cpp' %REMARK 'Имя генератора и расширение файла целевого языка. Потом мы сделаем так, чтобы они могли не совпадать' Self .DumpAsIs %REMARK 'Пока выводим всё "как есть", без трансформации в целевой язык' ; // c++ elem_generator h %SUMMARY ' Генератор выводящий элементы модели в *.h. Про файлы *.h мы потом поговорим отдельно. ' ; %GEN_PROPERTY Name 'h' %REMARK 'Имя генератора и расширение файла целевого языка. Потом мы сделаем так, чтобы они могли не совпадать' Self .DumpAsIs %REMARK 'Пока выводим всё "как есть", без трансформации в целевой язык' ; // h
Комментариев нет:
Отправить комментарий