Original in Russian: http://programmingmindstream.blogspot.ru/2015/08/blog-post_35.html
The previous series was here – Code generation. Extracting each child element to separate files.
Let’s extract almost everything related to the meta-model to external dictionaries.
We will not touch anything related to the specific model and its generation.
Here’s what we get:
https://bitbucket.org/lulinalex/mindstream/src/ebbf27e8918717c982d0b756118a081620155d71/Examples/Scripts/CodeGeneration/CodeGen67.ms.script?at=B284
The previous series was here – Code generation. Extracting each child element to separate files.
Let’s extract almost everything related to the meta-model to external dictionaries.
We will not touch anything related to the specific model and its generation.
Here’s what we get:
https://bitbucket.org/lulinalex/mindstream/src/ebbf27e8918717c982d0b756118a081620155d71/Examples/Scripts/CodeGeneration/CodeGen67.ms.script?at=B284
USES metaMACRO.ms.dict classRelations.ms.dict EngineTypes.ms.dict Object.ms.dict ; Test CodeGen %REMARK ' CodeGen - function to test functionality ' %REMARK ' %SUMMARY is meta information that allows binding the documentation to the code elements. Consequently, the documentation is available from the script engine. ' %SUMMARY ' 'That is where we test meta-model building, model building and then code generation. ' ; // %SUMMARY USES Templates.ms.model ; // --------------------------------------------------------------------------- concrete-model-begin 'Model of the specific project Project1' ' This is where we determine axiomatic of the specific model of the specific project We will separate it in a dictionary later. ' <<Project>> Project1 %SUMMARY ' This is our first project - Project1 ' ; // %SUMMARY <<Library>> Library1 %SUMMARY ' Probably, there are design libraries in our project. The Library1 is our first design library. ' ; // %SUMMARY ; // Library1 <<Library>> Library2 %SUMMARY ' Our project is probably serious enough and has MORE THAN ONE library. The Library2 is our second design library. ' ; // %SUMMARY ; // Library2 <<Library>> Library3 %SUMMARY ' Our project is probably SO serious that it has even MORE THAN TWO libraries. The Library3 is our third design library. ' ; // %SUMMARY ; // Library3 <<Program>> Program1 %SUMMARY ' Our project probably implements some program. Otherwise, why would we need it? The Program1 is a program in our Project1. ' ; // %SUMMARY <<Class>> Class1 %SUMMARY ' Our program probably has some implementation classes. Otherwise, how would we implement our functionality? The Class1 is our FIRST implementation class in our Program1. ' ; // %SUMMARY ; // Class1 <<Interface>> Interface1 %SUMMARY ' Our program is probably SO serious that implements some interfaces. The Interface1 is our FIRST interface. ' ; // %SUMMARY ; // Interface1 <<Interface>> Interface2 %SUMMARY ' Our program is probably SO serious that it implements MORE THAN ONE interface. The Interface2 is our second interface. ' ; // %SUMMARY ; // Interface2 <<Class>> Class2 %SUMMARY ' Our program is probably serious enough and has MORE THAN ONE implementation class. The Class2 is our second implementation class in Program1. ' ; // %SUMMARY %INHERITS Addr Class1 %REMARK 'Perhaps the design Class2 is inherited from Class1' ; // %INHERITS %IMPLEMENTS Addr Interface1 %REMARK 'Perhaps the design Class2 implements Interface1' Addr Interface2 %REMARK 'Perhaps the design Class2 implements Interface2, too' ; // %IMPLEMENTS ; // Class2 <<Class>> Class3 %SUMMARY ' Our program is probably so complex that it has even more than TWO implementation classes. The Class3 is the THIRD implementation class within the Program1. ' ; // %SUMMARY ; // Class3 <<Class>> Class4 %SUMMARY ' We are probably so cool that we have even more than THREE implementation classes. The Class4 is the FOURTH implementation class within the Program1. ; // %SUMMARY %INHERITS Addr Class2 Addr Class3 %REMARK ' We are probably cool enough to use MULTIPLE INHERITANCE and, moreover, to UNDERSTAND WHY we need it. The Class4 is inherited from Class2 and Class3. ' ; // %INHERITS ; // Class4 ; // Program1 ; // Project1 %REMARK ' These words should “probably” be based on requirements specification and UseCase. Well, we will talk it over later. ' model-end // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- concrete-model-begin 'Model of the specific project Project2' ' This is where we determine axiomatic of the specific model of the specific project We will separate it in a dictionary later. ' <<Project>> Project2 %SUMMARY ' This is our SECOND project - Project2 ' ; // %SUMMARY ; // Project2 model-end // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- concrete-model-begin 'Model of the specific project Project3' ' This is where we determine axiomatic of the specific model of the specific project. We will separate it in a dictionary later. ' <<Project>> Project3 %SUMMARY ' This is our THIRD project - Project3 ' ; // %SUMMARY ; // Project3 model-end // --------------------------------------------------------------------------- USES CodeDump.ms.dict // - the CodeDump.ms.dict is loaded so we can “see” the DumpElement word ; this.method.addr DumpElement %REMARK ' - the CodeGen element and its contents are dumped in a standard output device. We only do it to debug what we’ve written. ' help %REMARK ' The available axiomatic is output to a standard output device. We only do it to debug what we’ve written. ' USES Generation.ms.dict ; elem_proc DumpAsIs %SUMMARY 'Printing procedure for model element content, recursively.' ; [ g_CurrentGeneratorName ':' %REMARK 'Outputs the name of the current generator for debugging' for ( Self LIST %ST Reverted ) .Name %REMARK 'Outputs the stereotype of the element, recursively' Self .Name %REMARK 'Outputs the element name' ] ' ' strings:CatSep OutToFile [ 'Element’s parents ' for ( Self .Parents >reverted> ) .Name %REMARK 'Outputs the parents of the element, recursively' ] '::' strings:CatSep OutToFile for ( Self .Inherited ) ( .Name OutToFile ) for ( Self .Implements ) ( .Name OutToFile ) TRY Self .CallChildrenCurrentGen %REMARK 'Outputs the element’s children with the same generator' FINALLY [ '; // ' Self .Name ] OutToFile %REMARK 'Outputs the closing bracket of the element' END ; // DumpAsIs elem_generator dump %SUMMARY 'Output generator for of the model’s element’s dump.' ; %GEN_PROPERTY Name 'dump' %REMARK 'Generator name and file extension for target language. Later, we try to avoid coincidence' Self .DumpAsIs %REMARK 'For now, output “as it is” without transformation to target language' ; // dump elem_generator pas %SUMMARY 'Generator to output model elements to Pascal.' ; %GEN_PROPERTY Name 'pas' %REMARK 'Generator name and file extension for target language. Later, we try to avoid coincidence' Self .DumpAsIs %REMARK 'For now, output “as it is” without transformation to target language' ; // pas elem_generator script %SUMMARY 'Generator to output model elements to ms.script.' ; %GEN_PROPERTY Name 'ms.script' %REMARK 'Generator name and file extension for target language. Later, we try to avoid coincidence' Self .DumpAsIs %REMARK 'For now, output “as it is” without transformation to target language' ; // script elem_generator c++ %SUMMARY ' 'Generator to output model elements to c++. Later we will specially talk about *.h files. ' ; %GEN_PROPERTY Name 'cpp' %REMARK 'Generator name and file extension for target language. Later, we try to avoid coincidence' Self .DumpAsIs %REMARK 'For now, output “as it is” without transformation to target language' ; // c++ elem_generator h %SUMMARY ' Generator to output model elements to *.h. Later we will specially talk about *.h files. ' ; %GEN_PROPERTY Name 'h' %REMARK 'Generator name and file extension for target language. Later, we try to avoid coincidence' Self .DumpAsIs %REMARK 'For now, output “as it is” without transformation to target language' ; // h ( Project1 Project2 Project3 ) %REMARK 'Full list of root elements (projects)' ( .dump .pas .c++ .h .script ) %REMARK 'Full list of generators' CallGensList %REMARK '- launches the list of generators on the model’s “root elements” list' ; // CodeGen CodeGen
Комментариев нет:
Отправить комментарий