我正在为相当基本的脚本语言编写转换器,但它似乎缺乏使用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
是否有更简单的方法来识别这些模式,还是需要钻研更复杂的东西,如神经网络?
答案 0 :(得分:1)
我不知道&#34;更简单&#34;。
你想要的是一个检测参数克隆的克隆检测器。这会找到重复的克隆序列,这样可以实例化具有参数的克隆以生成确切的代码实例。
您的示例循环包含重复的参数化克隆实例:
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,那么这将为您提供核心参数克隆。然后,您可以执行您认为有用的其他优化。