ROSE Compiler Framework/How to create a cross-language translator
From Wikibooks, open books for an open world
In this HOW-to, it presents the steps of generating a cross-language translator. We will use Fortran to C translator as an example here.
Change the sourcefile information
- change the output file name. The suffix name has to be changed with this following function.
void SgFile::set_unparse_output_filename (std::string unparse_output_filename )
- change the output language type.
void SgFile::set_outputLanguage(SgFile::outputLanguageOption_enum outputLanguage)
- Set the output to be target-language only.
We use set_C_only for the Fortran to C translation. This process might be optional.
void SgFile::set_C_only(bool C_only)
Identify language-dependent AST node
- Example: ROSE AST uses different AST nodes to present a loop in C and Fortran. The following two figures represent the same loop for different languages.
- C uses SgForStatement for the for loops.
- Fortran uses SgFortranDo for the do loops.
Implement the translation functions
- Use the wholeAST as reference to implement the translation function.
- Generate the new AST node by copy required information from the original AST node.
- Remove the original node, and make sure the parent/child relationship in AST is setup properly.
Testing output code
- If compiler is available to test the output code, run the backend to generate object by the backend compiler.
- If compiler is not available for the target language, make sure output codes can be generated from the testing cases. It is suggested to run the compilation tests for all the testing output.