一种基于双AST序列的代码补全方法及系统技术方案

技术编号:20796696 阅读:27 留言:0更新日期:2019-04-06 10:20
本发明专利技术提供了一种基于双AST序列的代码补全方法及系统,包括:源代码处理步骤,使用抽象语法树解析源代码;AST转二叉树步骤,将上述抽象语法树同时转换为两个不同序列;模型训练步骤,将所述两个不同序列输入LSTM模型,训练语言模型;预测补全步骤,根据训练过的语言模型补全代码。本发明专利技术将待学习的程序代码的抽象语法树(AST)同时转换为两个序列(如“前序序列”和“中序序列”),并同时利用这两个序列的信息训练一个LSTM模型。本发明专利技术的方法训练出的LSTM具有更高的准确率。本发明专利技术的技术方案具有简单、快速的特点,能够较好地提高代码推荐的准确率和推荐效率。

A Code Completion Method and System Based on Double AST Sequences

The invention provides a code completion method and system based on double AST sequences, including: source code processing steps, using abstract grammar tree to parse source code; AST to binary tree steps, converting the above abstract grammar tree into two different sequences at the same time; model training steps, input the two different sequences into LSTM model, training language model; prediction completion steps, according to training. Practiced language model to complete the code. The abstract grammar tree (AST) of the program code to be studied is transformed into two sequences at the same time (such as \preface sequence\ and \intermediate sequence\), and an LSTM model is trained using the information of the two sequences at the same time. The LSTM trained by the method of the invention has higher accuracy. The technical scheme of the invention has the characteristics of simplicity and rapidity, and can better improve the accuracy and efficiency of code recommendation.

【技术实现步骤摘要】
一种基于双AST序列的代码补全方法及系统
本专利技术涉及计算机软件工程
,尤其是涉及一种基于双AST序列的代码补全方法及系统。
技术介绍
一个程序往往具有不同层次的结构,每个层次的结构对应着相应的程序分析过程,因而可以从不同的分析过程中获取不同抽象程度的程序信息。很多程序需要编译才能运行,如C、C++、C#、Java等,而编译中的各种技术也常用于程序分析任务中;编译大致流程如图1所示。典型的,由词法分析(LexicalAnalysis)、语法分析(SyntaxAnalysis)和语义分析(SemanticAnalysis),可以得到程序的词法信息和语法、语义信息,不确切的说,也可以将其理解为程序的“字面”信息和“结构”信息。显然,两者对于理解分析一个程序的功能都是十分重要的。现在有很多研究利用深度学习模型来进行程序分析,直观的想法是利用循环神经网络(RecurrentNeuralNetwork,RNN)对程序源代码(或者源程序的词序列,即token序列)建立语言模型。而这样的做法仅仅运用了程序最底层的信息——词法信息——来分析程序。然而,和自然语言不同,程序的结构信息包含了更本质的信息,直接利用程序的源代码/词序列进行建模,不能很好地反映程序本身的信息。换言之,仅利用词法信息对程序进行分析不够完善,没有充分利用程序源代码各方面的信息。再者,不同的任务对不同的程序信息敏感程度不同,某些程序分析任务即便只利用更抽象的程序信息也更加有效,而如程序分类任务就对程序结构更敏感,这是因为程序结构反映了程序的功能。如把程序中的自定义标识符i替换成iii,程序的结构是完全不改变的,即程序的功能不改变。绝大多数的程序员在进行软件开发的过程中会使用框架或库API来复用代码。但程序员几乎不可能记住所有的API,因为现有的API数量已经很庞大。因此,代码自动补全机制已经成为现代集成开发环境(IntegratedDevelopmentEnvironment,IDE)中的不可或缺的组成部分。据统计,代码补全是开发者最常使用的十个指令之一。代码补全机制在程序员输入代码时会尝试补全程序的剩余部分。智能的代码补全可以通过消除编程时的输入错误和推荐合适的API来加快软件开发过程。目前,把代码转换为AST(AbstractSyntaxTree,抽象语法树),然后再把抽象语法树转换为一个Token(标识符)序列并使用得到的AST序列数据训练LSTM是一种代码生成的方法。然而,根据数据结构的基础理论,只使用一个单一的序列如只使用“前序序列”是难以描述清楚原始的AST树结构的。也就是说,当把一个AST转换为一个序列的时候,损失掉了很多树结构的信息(也就是说,仅仅依赖一个序列,无法转换回原始的AST)。要完整的保存一棵语法树的全部信息,必须同时至少使用两个序列(如,同时使用“前序序列”和“中序序列”才能完整地保存一棵树的信息。
技术实现思路
为解决以上问题,本专利技术将待学习的程序代码的抽象语法树(AST)同时转换为两个序列(如“前序序列”和“中序序列”),并同时利用这两个序列的信息训练一个LSTM模型。具体的,本专利技术提供了一种基于双AST序列的代码补全方法,包括:源代码处理步骤,使用抽象语法树解析源代码;序列生成步骤,将上述抽象语法树同时转换为两个不同序列;模型训练步骤,将所述两个不同序列输入LSTM模型,训练语言模型;预测补全步骤,根据训练过的语言模型补全代码。优选的,在源代码处理步骤中,所述源代码被解析为不同形式,以获得代码的类、方法列表、代码标识符。优选的,所述序列生成步骤包括:通过前序遍历和中序遍历得到前序序列和中序序列,拼接前序序列和中序序列,当作后续LSTM网络的输入。优选的,所述序列生成步骤进一步包括:通过中序遍历和后序遍历得到中序序列和后序序列,拼接中序序列和后序序列,当作后续LSTM网络的输入。优选的,所述LSTM模型为串联的LSTM模型,所述LSTM模型位于RNN模型的隐藏层。优选的,在预测补全步骤中,将部分代码片段输入已经训练过的语言模型,从而根据上下文输出推荐的代码元素。根据本专利技术的另一个方面,还提供了一种基于双AST序列的代码补全系统,包括顺序连接的如下模块:源代码处理模块,使用抽象语法树解析源代码;序列生成模块,将上述抽象语法树同时转换为两个不同序列;模型训练模块,将所述两个不同序列输入LSTM模型,训练语言模型;预测补全模块,用于根据训练过的语言模型补全代码。优选的,所述源代码处理模块将所述源代码解析为不同形式,以获得代码的类、方法列表、代码标识符。优选的,所述序列生成模块通过前序遍历和中序遍历得到前序序列和中序序列,拼接前序序列和中序序列,当作后续LSTM网络的输入。优选的,序列生成模块进一步通过中序遍历和后序遍历得到中序序列和后序序列,拼接中序序列和后序序列,当作后续LSTM网络的输入。本专利技术的方法训练出的LSTM具有更高的准确率。本专利技术的技术方案具有简单、快速的特点,能够较好地提高代码推荐的准确率和推荐效率。附图说明通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本专利技术的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:图1为现有程序的编译流程图。图2为本专利技术基于双AST序列的代码补全方法流程图。图3为本专利技术基于双AST序列的代码补全系统结构图。图4为本专利技术“前序+中序”拼接输入序列的实验训练结果示意图。图5为本专利技术“中序+后序”拼接输入序列的实验训练结果示意图。图6为四种不同的LSTM输入序列的实验训练结果示意图。具体实施方式下面将参照附图更详细地描述本专利技术的示例性实施方式。虽然附图中显示了本专利技术的示例性实施方式,然而应当理解,可以以各种形式实现本专利技术而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了能够更透彻地理解本专利技术,并且能够将本专利技术的范围完整的传达给本领域的技术人员。本专利技术将AST(AbstractSyntaxTree,抽象语法树)进行序列化,并对AST序列化结果进行建模,这样就可以用LSTM序列模型(长短期记忆网络,循环神经网络的一种)对程序的结构信息进行分析,进而完成程序分类任务。换言之,本专利技术在利用LSTM序列模型进行程序分类任务的基础上进行了改进,将原始语言模型的词法级别输入(token序列)替换成了AST序列化结果,主要利用程序的结构信息进行分析,并取得了理想的结果。RNN(循环神经网络)是一类常用的人工神经网络,适合用于处理时序输入序列,输出可以设定为不同长度的序列(甚至为1);早期RNN不能处理长期依赖问题,即RNN会“遗忘”信息。LSTM(长短期记忆网络)是RNN一种变体,解决了长期依赖问题,具备一定的记忆能力,适合处理预测时间序列中间隔和延迟较长的事件。但不论是哪种类型的RNN,输入都必须是序列,如果要利用LSTM分析程序的结构,就必须考虑序列化体现程序信息的结构——这里本专利技术使用AST。程序的结构常为树状结构,而LSTM为线性结构的序列模型。根据数据结构的知识:1、多叉树和二叉树一一对应。2、二叉树和中序遍历序列、前序/后序遍历序列一一对应;或者说,中本文档来自技高网
...

【技术保护点】
1.一种基于双AST序列的代码补全方法,其特征在于,包括:源代码处理步骤,使用抽象语法树解析源代码;序列生成步骤,将上述抽象语法树同时转换为两个不同序列;模型训练步骤,将所述两个不同序列输入LSTM模型,训练语言模型;预测补全步骤,根据训练过的语言模型补全代码。

【技术特征摘要】
1.一种基于双AST序列的代码补全方法,其特征在于,包括:源代码处理步骤,使用抽象语法树解析源代码;序列生成步骤,将上述抽象语法树同时转换为两个不同序列;模型训练步骤,将所述两个不同序列输入LSTM模型,训练语言模型;预测补全步骤,根据训练过的语言模型补全代码。2.根据权利要求1所述的基于双AST序列的代码补全方法,其特征在于:在源代码处理步骤中,所述源代码被解析为不同形式,以获得代码的类、方法列表、代码标识符。3.根据权利要求1所述的基于双AST序列的代码补全方法,其特征在于:所述序列生成步骤包括:通过前序遍历和中序遍历得到前序序列和中序序列,拼接前序序列和中序序列,当作后续LSTM网络的输入。4.根据权利要求3所述的基于双AST序列的代码补全方法,其特征在于:所述序列生成步骤进一步包括:通过中序遍历和后序遍历得到中序序列和后序序列,拼接中序序列和后序序列,当作后续LSTM网络的输入。5.根据权利要求1或2所述的基于双AST序列的代码补全方法,其特征在于:所述LSTM模型为堆叠式的LSTM模型。6.根据权利要求1所述的基...

【专利技术属性】
技术研发人员:李戈郝逸洋刘洋
申请(专利权)人:北京硅心科技有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1