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

因为我们学校的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编译器推荐一本书,可以作为工具书用,相当方便!!!

基于抽象语法树的Online Judge语义查重系统设计与实现(毕设)相关推荐

  1. jsqlparser:基于抽象语法树(AST)遍历SQL语句的语法元素

    jsqlparser是一个java的SQL语句解析器,基于它可以实现很多之前无法完成的工作. <!-- maven 依赖库引用 --><dependency><group ...

  2. android 语法分析方法,基于抽象语法树的Android应用相似度检测方法

    Similarity Detection of Android Application Based on Abstract Syntax Tree ZHAN Lichao 1 占力超 (1989-), ...

  3. 基于Python的JS逆向和AST抽象语法树

    一.关于js逆向的一些知识点总结 javascript-数据类型中,null,undefinded都表示没有东西 普通函数,匿名函数,构造函数,一般常见的是匿名函数 函数可以当成字符串看待,可以看成参 ...

  4. js 数组 实现 完全树_JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    摘要: JS的"编译原理". 原文:JavaScript的工作原理:解析.抽象语法树(AST)+ 提升编译速度5个技巧 作者:前端小智 Fundebug经授权转载,版权归原作者所有 ...

  5. JavaScript 是如何工作的:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...

  6. php7 ast,PHP7新特性之抽象语法树(AST)带来的变化详解

    本文分析了PHP7新特性之抽象语法树(AST)带来的变化.分享给大家供大家参考,具体如下: 这里大部分内容参照 AST 的 RFC 文档而成:https://wiki.php.net/rfc/abst ...

  7. php7 ast,PHP7 的抽象语法树(AST)带来的变化

    什么是抽象语法树? 抽象语法树(abstract syntax tree,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,这所以说是抽象的,是因为抽象语法树并不会表示 ...

  8. 高级前端基础-JavaScript抽象语法树AST

    前言 Babel为当前最流行的代码JavaScript编译器了,其使用的JavaScript解析器为babel-parser,最初是从Acorn 项目fork出来的.Acorn 非常快,易于使用,并且 ...

  9. PHP程序运行流程:语法分析(Parse)与抽象语法树(AST),PHP-Parser

    什么是抽象语法树? 在 PHP5中,从 php 脚本到 Opcodes 的执行的过程是: Lexing:词法扫描分析,将源文件转换成 Token 流: Parsing:语法分析,在此阶段生成 Opco ...

最新文章

  1. FW: HTTP错误500显示具体的出错信息的方法
  2. Android app:transformNativeLibsWithStripDebugSymbolForDebug错误分析
  3. Lintcode--5(37)--反转一个三位数
  4. PC软件开发技术之一:在WinCC中通过VBS操作SQL Server2005
  5. 这篇 Linux 总结得很棒啊!
  6. 容器编排技术 -- 使用Vagrant本地运行Kubernetes
  7. Python数据分析Numpy库方法简介(一)
  8. Javascript版-显示相应图片的详细信息
  9. pyinstaller打包含有openCV库时缺失config文件报错
  10. 几个常用的后台管理系统
  11. 基于C++的关键字检索系统
  12. ocelot和nginx比较_针对 Ocelot 网关的性能测试
  13. html:用script实现搜索框
  14. npm install 报错 Failed at the XXX install script
  15. Guitar Pro8.1吉他谱神器下载及简谱功能
  16. 基于Open3D的Lidar-Segment
  17. 无线洗地机哪款性价比高?高性价比的洗地机分享
  18. 利用Python爬取金十数据新闻事件
  19. 张一鸣:Stay hungry, Stay young
  20. android手机闹钟在那里面,手机闹钟软件哪个好用 安卓手机怎么设置闹钟

热门文章

  1. Envato不停机迁移边缘网络提供商
  2. 软件设计的基本原理和流程
  3. python 爬网页版钉钉消息_Python实现钉钉订阅消息功能
  4. 微型计算机室内太干燥,暖气屋里太干燥怎么办 七种方法增加室内湿度
  5. 漏电检测系统客户端上位机设计
  6. java %3cbr%3e字符替换,Java 網絡編程之 (完全總結)
  7. 可作为计算机主机的IP地址,怎么样判断一个ip是否可以作为主机ip地址
  8. 环回接口是做什么的?
  9. python 英语词汇_使用Python进行英文单词分割
  10. foxmail邮件只能显示邮件头,不能显示内容