Parsing 源代码逻辑评估
我得到了一段代码(例如,一个名为bubbleSort()的函数,用Java编写)。我,或者说我的程序,如何判断给定的源代码是否以正确的方式实现了特定的排序算法(例如,使用bubble方法) 我可以通过分析函数签名强制用户给出合法函数:确保参数和返回值是整数数组。但我不知道如何确定算法逻辑是否正确。输入代码可以正确地对值进行排序,但不能使用前面提到的冒泡方法。我的程序如何识别这一点?我确实意识到会涉及到很多代码解析,但也许还有一些事情我应该知道 我希望我说得有点清楚Parsing 源代码逻辑评估,parsing,token,grammar,abstract-syntax-tree,Parsing,Token,Grammar,Abstract Syntax Tree,我得到了一段代码(例如,一个名为bubbleSort()的函数,用Java编写)。我,或者说我的程序,如何判断给定的源代码是否以正确的方式实现了特定的排序算法(例如,使用bubble方法) 我可以通过分析函数签名强制用户给出合法函数:确保参数和返回值是整数数组。但我不知道如何确定算法逻辑是否正确。输入代码可以正确地对值进行排序,但不能使用前面提到的冒泡方法。我的程序如何识别这一点?我确实意识到会涉及到很多代码解析,但也许还有一些事情我应该知道 我希望我说得有点清楚 如果有人能为我指出正确的方向,
如果有人能为我指出正确的方向,或者就如何解决这样的问题提出建议,我将不胜感激。也许有一些经过测试的方法可以简化对程序逻辑的评估。一般来说,由于暂停问题,您不能这样做。您甚至无法决定函数是否将停止(“返回”) 实际上,还有一点希望。如果要查找冒泡排序,可以确定它有多个部分:
- 要按偏序排序的数据类型S
- 带有单实例变量a(“数组”)的容器数据类型C
- 它保存要排序的数据
- 用于访问具有偏序的容器的键类型K(“数组索引”) 使容器[K]为S型
- 使用键a和键B比较容器的两个成员 这样AA的容器
- 对容器[a]、容器[B]和某些类型为S的变量T的交换操作,它有条件地依赖于比较
- 围绕容器的循环,根据K上的偏序枚举中的键
- 解析源代码并构建抽象语法树
- 构建符号表(ST),以了解使用它的每个标识符的类型
- 构造控制流图(CFG),以便检查各种可识别的位是否以适当的顺序出现
- 构造一个数据流图(DFG),以便您可以确定在算法的一部分中识别的值正确地流向另一部分
数据流模式域C;
数据流模式交换(in-out v1:S、in-out v2:S、T:S):语句=
“\T=\v1;
\v1=\v2;
\v2=\T;“;
数据流模式条件交换(in out v1:S、in out v2:S、T:S):语句=
“如果(\v1>\v2)
\交换(\v1\v2\T)
数据流模式容器访问(inout容器C,在key:K中):表达式
=“\container.body[\K]”;
数据流模式大小(容器中:C,输出:整数):表达式
=“\container.size”
数据流模式气泡_排序(入出容器:C、k1:K、k2:K):函数
“\k1=\smallestK\(\);
而(\k1
dataflow pattern domain C;
dataflow pattern swap(in out v1:S, in out v2:S, T:S):statements =
" \T = \v1;
\v1 = \v2;
\v2 = \T;";
dataflow pattern conditional_swap(in out v1:S, in out v2:S,T:S):statements=
" if (\v1 > \v2)
\swap(\v1,\v2,\T);"
dataflow pattern container_access(inout container C, in key: K):expression
= " \container.body[\K] ";
dataflow pattern size(in container:C, out: integer):expression
= " \container . size "
dataflow pattern bubble_sort(in out container:C, k1: K, k2: K):function
" \k1 = \smallestK\(\);
while (\k1<\size\(container\)) {
\k2 = \next\(k1);
while (\k2 <= \size\(container\) {
\conditionalswap\(\container_access\(\container\,\k1\),
\container_access\(\container\,\k2\) \)
}
}
";