我有用热休克编写的大型代码库(维基百科文章--想想"BASIC",但是是日语)。
我的意思是,它有151352行代码,60个源文件,总代码大小为4.5MB。此外,它有大量的意大利面代码,没有评论和迫切需要重构。好的是它有大量的文本消息,所以并不是所有的行都代表实际的程序逻辑。
我想将这个代码基转换为C++,同时保持我的理智。“我想要”意味着我不是所要求的来做它,但我强烈希望找到一种方法来做它。
什么是好办法?显然,我不能仅仅用C++重写它(理论上我可以这样做,但需要两年时间,我会在过程中引入许多but ),所以(我认为)一个合理的决定是实现代码重新编译/预处理器,这将允许我将源代码转换为混乱的C++ (HSP比C++简单得多,因此应该是可能的),然后开始重构/记录结果。
不幸的是,我并不完全确定如何有效地构建重新编译器。虽然我知道有Lex/Yacc/Bison/Boost::spirit,但我没有亲自使用它们。
那么,你能推荐一种好的方式来执行这样的转换吗?任何在windows平台上可用的免费工具(“免费”,如“免费啤酒”)都是允许的,只要它不影响原始源代码的许可。
发布于 2012-05-23 23:31:21
根据代码库的原始所有者,从版本3开始的HSP包括HSP到C代码转换器。由于时间不够,没有对信息进行验证,但是这个博客文章文档记录了名为hspcnv的工具,该工具应该将hspcnv代码转换为C代码。这篇文章是日文的。
发布于 2012-05-19 13:44:18
Yacc的目标是有效地处理更复杂的任务,而且学习也很复杂,我认为这太过分了。
精神应该是一个更好的选择,如果你已经知道去它,个人我会使用Prolog为这项任务。
Prolog有内置语法分析,即DCG。对于作为基本语言的简单语言,我确信语法上没有实际问题,而现代Prolog(我认为simple有效地)可以很好地处理源中的复杂字符编码。
此外,在Prolog中,您可以尝试应用一些天真来展开意大利面代码。一般来说,这是一项复杂的任务,但如果你只有少量的模式,重复多次,那就很容易了。
模式匹配是解决这些问题的关键.
发布于 2012-05-19 13:50:00
好吧,如果您真的想这样做,忘记注释中的建议,那么您可能应该好好看看openhsp编译器,主要是codegen文件:
在你的眼皮底下也有记号:
看来HSP并没有那么复杂,您可以跳过AST步骤。不过,您可以从中获得很好的优化。不要忘记准备一个C++库来嵌入您生成的代码,这样您就可以管理HSP (比如globals和动态类型)。
如果你能破解其中的一些东西,你也将不得不删除这个编译器所做的大部分工作(创建可执行文件,链接等等)。别忘了,这是一项非常漫长而艰巨的任务,它可能不会比完全重写更快或更容易。但是,如果你准备好了,你会发现它很难找到:)
https://stackoverflow.com/questions/10665402
复制相似问题