我正在为相当基本的脚本语言编写一个转换器,但它似乎缺乏使用 for 循环的能力。这使得代码非常困惑和冗余,例如,而不是:
for(int i = 0; i < 5; i++) {
ECHO Hello World!
SLEEP 500
}
用这种语言编写的脚本最终看起来像这样:
ECHO Hello World!
SLEEP 500
ECHO Hello World!
SLEEP 500
ECHO Hello World!
SLEEP 500
ECHO Hello World!
SLEEP 500
ECHO Hello World!
SLEEP 500
等等。所以基本上,我将此脚本转换为 C++,是否可以减少所有这些重复调用?我曾考虑过循环并查找重复的代码,但是问题出现了,我无法处理这样的代码:
ECHO 1
SLEEP 500
ECHO 2
SLEEP 500
ECHO 3
SLEEP 500
ECHO 4
是否有更简单的方法来识别这些模式,或者我是否需要深入研究更复杂的东西,例如神经网络?
最佳答案
我不知道“更简单”。
您想要的是一个检测参数克隆的克隆检测器。这会找到重复的克隆序列,以便可以实例化具有参数的克隆以生成精确的代码实例。
您的示例循环包含的是参数化克隆的重复实例:
ECHO n
SLEEP 500
所以序列的第一个抽象是:
for n in {1,2,3,4}
ECHO n
SLEEP 500
序列上的 for 循环很容易转换为:
for n=1,4 step 1
ECHO n
SLEEP 500
这是我认为您想要生成的代码。
所以你的问题是获得一个参数克隆检测器。
查看此technical paper on how to implement a parametric cloned detector over abstract syntax trees 。这些不是容易构建的工具。但是,如果您构建一个,那么如果您可以将脚本语言解析为 AST,那么这将为您提供核心参数克隆。然后您可以进行您认为有用的其他优化。
关于javascript - 通过算法将冗余代码优化为循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23918909/