zoukankan      html  css  js  c++  java
  • 基于抽象语法树的Online Judge语义查重系统设计与实现(毕设)

    前段时间做的毕业设计,一直没有时间发出来,现在分享出来,希望大家能够批评指正,共同提高。偷笑

    因为我们学校的OJ是基于华中科大的,所以整个项目是建立在HUSTOJ基础上的,本次的毕业设计也在这个基础上的。

    这里的抽象语法树的建立用到了GCC的部分功能,分析之前先通过增加编译参数-fdump-translation-unit生成.tu的文件,不过生成的这个语法树是文本的,所以这里还需要对这个文本抽象语法树通过树的数据结构建立起来,建立树之后再标准化,这样能够提高分析的准确性,最后通过树编辑距离的方式(这里运用Zhang-Shasha算法)对树进行分析,从而最终得出其相似度。

    我们学校之前用的相似度分析是基于阿姆斯特丹一名教授很久之前设计的SIM算法,也就是单纯的文本相似度分析,所以本次运用SIM相似度再结合抽象语法树分析,从而通过度量值的形式得出最终的相似度。

    突然写这么多东西可能会让读者有些懵逼,所以我决定将我毕业设计的部分代码和部分论文共享出来,但是会有所保留,毕竟已经部署在我们学校OJ上了,算是商业机密么,啦啦啦,别打我。。。

    希望大家批评指正,另外这里特别说明一下,哈工大的苏小红团队在做该方面研究,成果也用在了哈工大的Onlinejudge上面,他们使用的系统依赖图、控制依赖图、数据流图的方式分析的,当时做这个项目的时候考虑到时间和工作量的问题,所以就没有这么做,不过基于图的准确性应该高不少,我本次的项目毕竟是尝试性的,后期还需要我们学校老师再深层次研究,对于一些参数需要修改,从而进一步提高其准确性。我的方式和哈工大最大的区别在于所采用的数据结构不同,因此其本质上基于图的才是真正的语义分析,基于树的只能做到语法分析,但是我这次在标准化等步骤上也进一步考虑到了语义。

    GitHub共享地址(https://github.com/zsweet/Design-and-Implementation-of-Online-Judge-Semantic-Checking-System-Based-on-Abstract-Syntax-Tree),希望有相似研究的可以进一步交流,在思路上共享下,后期如果有时间可以尝试采用图和度量值的方式对代码相似度分析进一步研究!!!


    整理出的本次项目具体步骤如下:
    (1) 通过SIM算法,首先对模式代码和目标代码进行文本相似度分析,获取其文本相似度,作为度量值相似度的分析参数。
    (2) 由于GCC编译器能生成中间的AST[14],因此本文通过GCC产生文本抽象语法树,然后将文本抽象语法树消除冗余后转为树结构存储的AST,并进行多个阶段的标准化工作,其中包括选择语句标准化、循环语句标准化、函数调用结构标准化等,最终得到本文分析使用的语法树;
    (3) 对于标准化后的AST,通过树编辑距离算法,本文使用1989年提出的Zhang-Shasha[15]算法进行计算,获取模式程序与目标程序AST的最小编辑距离,获得结构代码相似度,作为度量值相似度的分析参数。
    (4) 对于(1)和(3)中得出的相似度参数,通过实验分析,最终获得基于度量值的相似度。
    (5) 在充分了解HUSTOJ[16]系统结构基础上,将该系统的实现部署在HUSTOJ上,从而最终实现语义查重系统。

     这里关于GCC编译器推荐一本书,可以作为工具书用,相当方便!!!

  • 相关阅读:
    P3990 [SHOI2013]超级跳马
    P4279 [SHOI2008]小约翰的游戏
    zabbix、agent端服务器图形化展示
    zabbix_agent代理端监控FTP服务
    hadoop SecondNamenode详解
    HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER
    Linux netstat命令详解(检验本机各端口的网络连接情况)
    查看监听端口命令
    Hadoop服务的端口50070无法访问的问题
    Linux-centos6.8下关闭防火墙
  • 原文地址:https://www.cnblogs.com/zswbky/p/8454127.html
Copyright © 2011-2022 走看看