跳转到内容

ROSE 编译器框架/如何创建跨语言翻译器

来自维基教科书,开放的书籍,开放的世界

在本 HOW-TO 中,将介绍生成跨语言翻译器的步骤。我们将使用 Fortran 到 C 的翻译器作为示例。

更改源文件信息

[编辑 | 编辑源代码]
  • 更改输出文件名。后缀名需要使用以下函数更改。
void SgFile::set_unparse_output_filename (std::string unparse_output_filename ) 
  • 更改输出语言类型。
void SgFile::set_outputLanguage(SgFile::outputLanguageOption_enum outputLanguage) 	
  • 将输出设置为仅目标语言。
 We use set_C_only for the Fortran to C translation.  This process might be optional.
void SgFile::set_C_only(bool C_only)

识别语言相关的 AST 节点

[编辑 | 编辑源代码]
  • 例如,ROSE AST 使用不同的 AST 节点来表示 C 和 Fortran 中的循环。下图显示了不同语言中的相同循环。
C 使用 SgForStatement 表示 for 循环。
C SgForStatement
Fortran 使用 SgFortranDo 表示 do 循环。
Fortran SgFortranDo

实现翻译函数

[编辑 | 编辑源代码]
  • 使用 wholeAST 作为参考来实现翻译函数。
  • 从原始 AST 节点复制所需信息,生成新的 AST 节点。
  • 删除原始节点,并确保 AST 中的父/子关系设置正确。

测试输出代码

[编辑 | 编辑源代码]
  • 如果编译器可用以测试输出代码,则运行后端使用后端编译器生成对象。
  • 如果目标语言的编译器不可用,则确保可以从测试用例生成输出代码。建议对所有测试输出运行编译测试。
华夏公益教科书