Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 源代码逻辑评估_Parsing_Token_Grammar_Abstract Syntax Tree - Fatal编程技术网

Parsing 源代码逻辑评估

Parsing 源代码逻辑评估,parsing,token,grammar,abstract-syntax-tree,Parsing,Token,Grammar,Abstract Syntax Tree,我得到了一段代码(例如,一个名为bubbleSort()的函数,用Java编写)。我,或者说我的程序,如何判断给定的源代码是否以正确的方式实现了特定的排序算法(例如,使用bubble方法) 我可以通过分析函数签名强制用户给出合法函数:确保参数和返回值是整数数组。但我不知道如何确定算法逻辑是否正确。输入代码可以正确地对值进行排序,但不能使用前面提到的冒泡方法。我的程序如何识别这一点?我确实意识到会涉及到很多代码解析,但也许还有一些事情我应该知道 我希望我说得有点清楚 如果有人能为我指出正确的方向,

我得到了一段代码(例如,一个名为bubbleSort()的函数,用Java编写)。我,或者说我的程序,如何判断给定的源代码是否以正确的方式实现了特定的排序算法(例如,使用bubble方法)

我可以通过分析函数签名强制用户给出合法函数:确保参数和返回值是整数数组。但我不知道如何确定算法逻辑是否正确。输入代码可以正确地对值进行排序,但不能使用前面提到的冒泡方法。我的程序如何识别这一点?我确实意识到会涉及到很多代码解析,但也许还有一些事情我应该知道

我希望我说得有点清楚


如果有人能为我指出正确的方向,或者就如何解决这样的问题提出建议,我将不胜感激。也许有一些经过测试的方法可以简化对程序逻辑的评估。

一般来说,由于暂停问题,您不能这样做。您甚至无法决定函数是否将停止(“返回”)

实际上,还有一点希望。如果要查找冒泡排序,可以确定它有多个部分:

  • 要按偏序排序的数据类型S
  • 带有单实例变量a(“数组”)的容器数据类型C
  • 它保存要排序的数据
  • 用于访问具有偏序的容器的键类型K(“数组索引”) 使容器[K]为S型
  • 使用键a和键B比较容器的两个成员 这样AA的容器
  • 对容器[a]、容器[B]和某些类型为S的变量T的交换操作,它有条件地依赖于比较
  • 围绕容器的循环,根据K上的偏序枚举中的键
您可以构建一些代码,在源代码中找到这些证据中的每一个,如果您找到了所有这些证据,就可以声称您有冒泡类型的证据

要具体做到这一点,您需要标准的程序分析机制:

  • 解析源代码并构建抽象语法树
  • 构建符号表(ST),以了解使用它的每个标识符的类型
  • 构造控制流图(CFG),以便检查各种可识别的位是否以适当的顺序出现
  • 构造一个数据流图(DFG),以便您可以确定在算法的一部分中识别的值正确地流向另一部分
[刚开始就有很多机器]

从这里,您可以编写特别的代码过程代码来爬过AST、ST、CFG、DFG,“识别”每个单独的部分。这可能是相当混乱的,因为每个识别器都会检查这些结构,寻找其位的证据。但是,你可以做到

这已经够麻烦了,也够有趣了,所以有一些工具可以做很多这方面的工作

我们的DMS软件再工程工具包就是其中之一。DMS已经包含了对几种语言进行标准程序分析的所有机制。DMS还有一种数据流模式匹配语言,其灵感来自于

使用DMS,您可以大致如下(未经测试)表示此特定问题:

数据流模式域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\)  \)
           }
       }
    ";