当前位置: 首页 > 专利查询>南京大学专利>正文

一种基于抽象语法树增广图模型的代码补全方法技术

技术编号:29132403 阅读:21 留言:0更新日期:2021-07-02 22:27
本发明专利技术公开一种基于抽象语法树增广图模型的代码补全方法,包括以下步骤:等待新的代码补全需求,获取待补全位置附近的源代码片段;解析待补全的源代码,将其表示为抽象语法树;遍历抽象语法树上各节点之间的顺序、语法和语义关系,通过带不同标记的有向边连接这些节点,将其表示为图的形式;将以图形式表示的代码进一步编码为矩阵形式;检查是否存在利用图信息的代码补全模型,若不存在,则训练代码补全模型;将编码后的图信息输入代码补全模型,给出预测结果。本发明专利技术将程序语言代码表示为图的形式,更好地体现代码各个语法单元之间的顺序、语法和语义关系,从而利用这些信息获得更高的预测准确率。

【技术实现步骤摘要】
一种基于抽象语法树增广图模型的代码补全方法
本专利技术涉及一种基于抽象语法树增广图模型的代码补全方法,属于涉及计算机软件工程

技术介绍
集成开发环境(IntegratedDevelopmentEnvironment,IDE)在现代软件工程中起着重要作用,而代码补全是其中最广泛使用的功能之一。智能代码补全功能根据已有的代码,列出了下一个可能的token(词法单元,例如变量和方法),可以有效地为软件开发人员带来便利。传统的代码完成方法使用类型信息和编程历史记录来给出补全项预测。类型信息用于过滤可能的补全选项,而编程历史用于对其进行排序。但是,上述方法对于某些动态类型化的语言(例如Python和JavaScript)具有局限性,并且其准确性也不令人满意。因此,基于机器学习的方法被设计为利用代码上下文(通常只有上文)的进行更好的预测。基于编程语言与自然语言存在一些相似之处的认识,一些研究采用统计语言模型对代码进行补全,如以n元语法(N-gram),递归神经网络(RecurrentNeuralNetwork,RNN)等序列预测模型对补全项进行预测。在这些模型中,源代码段被预处理为token序列或抽象语法树(AST)节点序列,然后由序列预测模型处理。根据预测模型给出的概率,对代码补全选项进行排序。然而,基于序列预测模型的代码补全方法忽视了代码中的一些重要信息。除了token的顺序之外,代码中还蕴含了丰富的语法信息(如AST上各节点的层次结构)和语义信息(如相同名称的标识符)。如果这些信息被合理并充分地利用,代码补全模型可以给出更高的预测准确率。
技术实现思路
专利技术目的:针对现有技术中存在的问题与不足,本专利技术提供一种利用丰富语法语义信息的代码补全方法,将源代码通过语法解析和语义分析转换为图的形式,以有向边的形式表示各种不同的顺序、语法和语义关系。后使用一种经修改的自注意力机制神经网络(Self-attentionnetwork),对以图形式表示的代码进行处理,给出更准确的预测结果。技术方案:一种基于抽象语法树增广图模型的代码补全方法,通过以下步骤,为程序开发人员提供更好的代码补全选项:步骤(1),等待新的代码补全需求,获取待补全位置上下若干行的源代码片段;步骤(2),对待补全的源代码片段进行语法解析,将其表示为抽象语法树;步骤(3),遍历抽象语法树,检查各节点之间的顺序、语法和语义关系,通过带不同标记的有向边连接这些节点,将抽象语法树表示为有向图的形式;步骤(4),将有向图编码成矩阵形式,包括节点信息矩阵和多个遮挡矩阵;步骤(5),检查是否存在已训练好的代码补全模型,如果不存在,转步骤(6);如果存在,转入步骤(11);步骤(6),收集开源代码组成代码库,从代码库提取大量的待补全代码片段和补全结果,作为训练数据;步骤(7),初始化以图形式表示代码上文的代码补全模型,该模型以自注意力网络为主体,使用路径特征编码和多视角遮挡机制这两种方法利用图信息;步骤(8),利用当前代码补全模型,预测用于训练的代码片段的补全选项概率分布;步骤(9),根据预测的补全选项概率分布和真实补全结果,计算当前模型的训练误差,并根据训练误差对模型参数的梯度对参数进行更新;步骤(10),计算模型在验证集上的预测损失,如果连续数轮训练过程中模型在验证集上的预测损失不再下降或者训练超过指定的步数,转步骤(11),否则转步骤(8)继续训练模型;步骤(11),将节点信息矩阵和遮挡矩阵输入已有的代码补全模型,该模型从编码图信息的矩阵中提取代码片段的语义特征,并利用该特征预测下一个补全选项;步骤(12),等待新的代码补全需求,若存在新需求,转步骤(1),否则代码补全过程结束。有益效果:现有的技术将代码作为一个token序列或者AST节点序列来进行处理,原本以树形式表示的带有层次结构的语法信息,在序列化的过程中被展平,丢失了大量的语法信息。同时,程序中还有由执行规则定义的大量语义信息,例如同一作用域下的同名变量意味着程序将访问相同的内存位置,这些信息在序列化预测模型中没有得到充分利用。与现有技术相比,本专利技术在根据代码上文推荐代码补全选项时,考虑了除token关系以外的丰富的语法信息和语义信息,这些信息能够更好地帮助对代码建模的过程,从而给出更准确的代码补全选项,提高程序开发人员的编程效率。附图说明图1为智能代码补全工具的工作过程图;图2为本专利技术实施例由未完成代码给出补全项预测的工作流程图;图3为本专利技术实施例的将代码以图形式表示的工作流程图;图4为本专利技术实施例将图编码为矩阵作为后续神经网络输入的工作流程图。具体实施方式下面结合具体实施例,进一步阐明本专利技术,应理解这些实施例仅用于说明本专利技术而不用于限制本专利技术的范围,在阅读了本专利技术之后,本领域技术人员对本专利技术的各种等价形式的修改均落于本申请所附权利要求所限定的范围。智能代码补全工具的工作过程如图1所示。在用户编程过程中,代码补全工具会等待用户触发代码补全需求。当代码补全工具被触发时,它会根据已有的代码上文预测补全选项,并将其展示给用户。用户选择补全选项或执行其它编辑操作后,单次代码补全任务完成,若用户继续编程,代码补全工具会继续等待用户下一次的代码补全需求。本实施例的代码补全方法的工作流程图如图2所示,基于抽象语法树增广图模型的代码补全方法包括以下步骤:步骤1,等待新的代码补全需求,获取待补全位置上下若干行的源代码片段;步骤2,对待补全的源代码片段进行语法解析,将其表示为抽象语法树;步骤3,遍历抽象语法树,检查各节点之间的顺序、语法和语义关系,通过带不同标记的有向边连接这些节点,将抽象语法树表示为有向图的形式;步骤4,将有向图编码成矩阵形式,包括节点信息矩阵和多个遮挡矩阵;步骤5,检查是否存在已训练好的代码补全模型,如果不存在,转步骤(6);如果存在,转入步骤11;步骤6,收集开源代码组成代码库,从代码库提取待补全代码片段和补全结果,作为训练数据;步骤7,初始化以图形式表示代码上文的代码补全模型,该模型以自注意力网络为主体,使用路径特征编码和多视角遮挡机制这两种方法利用图信息;步骤8,利用当前代码补全模型,预测用于训练的代码片段的补全选项概率分布;步骤9,根据预测的补全选项概率分布和真实补全结果,计算当前模型的训练误差,并根据训练误差对模型参数的梯度对参数进行更新;步骤10,计算模型在验证集上的预测损失,如果连续数轮训练过程中模型在验证集上的预测损失不再下降或者训练超过指定的步数,转步骤11,否则转步骤8继续训练模型;步骤11,将节点信息矩阵和遮挡矩阵输入已有的代码补全模型,该模型从编码图信息的矩阵中提取代码片段的语义特征,并利用该特征预测下一个补全选项;步骤12,等待新的代码补全需求,若存在新需求,转步骤1,否则代本文档来自技高网
...

【技术保护点】
1.一种基于抽象语法树增广图模型的代码补全方法,其特征在于,包括如下步骤:/n步骤(1),等待新的代码补全需求,获取待补全位置附近的源代码片段;/n步骤(2),对待补全的源代码片段进行语法解析,将其表示为抽象语法树;/n步骤(3),遍历抽象语法树,检查各节点之间的顺序、语法和语义关系,通过带不同标记的有向边连接这些节点,将抽象语法树表示为有向图的形式;/n步骤(4),将有向图编码成矩阵形式,包括节点信息矩阵和多个遮挡矩阵;/n步骤(5),检查是否存在已训练好的代码补全模型,如果不存在,转步骤(6);如果存在,转入步骤(11);/n步骤(6),收集开源代码组成代码库,从代码库提取待补全代码片段和补全结果,作为训练数据;/n步骤(7),初始化以图形式表示代码上文的代码补全模型,该模型以自注意力网络为主体,使用路径特征编码和多视角遮挡机制这两种方法利用图信息;/n步骤(8),利用当前代码补全模型,预测用于训练的代码片段的补全选项概率分布;/n步骤(9),根据预测的补全选项概率分布和真实补全结果,计算当前模型的训练误差,并根据训练误差对模型参数的梯度对参数进行更新;/n步骤(10),计算模型在验证集上的预测损失,如果连续数轮训练过程中模型在验证集上的预测损失不再下降或者训练超过指定的步数,转步骤(11),否则转步骤(8)继续训练模型;/n步骤(11),将节点信息矩阵和遮挡矩阵输入已有的代码补全模型,该模型从编码图信息的矩阵中提取代码片段的语义特征,并利用该特征预测下一个补全选项;/n步骤(12),等待新的代码补全需求,若存在新需求,转步骤(1),否则代码补全过程结束。/n...

【技术特征摘要】
1.一种基于抽象语法树增广图模型的代码补全方法,其特征在于,包括如下步骤:
步骤(1),等待新的代码补全需求,获取待补全位置附近的源代码片段;
步骤(2),对待补全的源代码片段进行语法解析,将其表示为抽象语法树;
步骤(3),遍历抽象语法树,检查各节点之间的顺序、语法和语义关系,通过带不同标记的有向边连接这些节点,将抽象语法树表示为有向图的形式;
步骤(4),将有向图编码成矩阵形式,包括节点信息矩阵和多个遮挡矩阵;
步骤(5),检查是否存在已训练好的代码补全模型,如果不存在,转步骤(6);如果存在,转入步骤(11);
步骤(6),收集开源代码组成代码库,从代码库提取待补全代码片段和补全结果,作为训练数据;
步骤(7),初始化以图形式表示代码上文的代码补全模型,该模型以自注意力网络为主体,使用路径特征编码和多视角遮挡机制这两种方法利用图信息;
步骤(8),利用当前代码补全模型,预测用于训练的代码片段的补全选项概率分布;
步骤(9),根据预测的补全选项概率分布和真实补全结果,计算当前模型的训练误差,并根据训练误差对模型参数的梯度对参数进行更新;
步骤(10),计算模型在验证集上的预测损失,如果连续数轮训练过程中模型在验证集上的预测损失不再下降或者训练超过指定的步数,转步骤(11),否则转步骤(8)继续训练模型;
步骤(11),将节点信息矩阵和遮挡矩阵输入已有的代码补全模型,该模型从编码图信息的矩阵中提取代码片段的语义特征,并利用该特征预测下一个补全选项;
步骤(12),等待新的代码补全需求,若存在新需求,转步骤(1),否则代码补全过程结束。


2.根据权利要求1所述的基于抽象语法树增广图模型的代码补全方法,其特征在于,将代码以图形式表示的实现过程为:
步骤301,根据抽象语法树的节点建立一张对应的新图,该新图包含抽象语法树的所有节点,并记录新图与抽象语法树节点间对应关系;在语法解析后,抽象语法树上的所有节点都带有语法单元类型属性,部分节点带有值属性,这些属性也被保留在新图上;待补全节点以指定标记出现在抽象语法树和新图上;
步骤302,通过遍历抽象语法树,查找节点间的各种顺序、语法和语义关系;有以下的序列关系被查找:先序遍历的前一节点、先序遍历的后一节点、先序遍历的前一叶节点、先序遍历的后一叶节点;有以下的语法关系被查找:父节点、第一个子节点、最后的子节点、前一个兄弟节点、后一个兄弟节点;有以下的语义关系被查找:上一个同类型节点、上一个同值节点、上一个同环境节点;
步骤303,根据步骤302确定的各种关系,在新图上的对应节点之间添加有向边,根据不同的关系类型,有向边带有不同的标记。


3.根据权利要求1所述的基于抽象语法树增广图模型的代码补全方法,其特征在于,代码片段对应的有向图经过编码后转换为实数矩阵,作为后续神经网络的输入。


4.根据权利要求3所述的基于抽象语法树增广图模型的代码补全方法,其特征在于,代码片段对应的有向图经过编码后转换为实数矩阵的过程为:
步骤401,对待补全节...

【专利技术属性】
技术研发人员:黎铭汤闻誉
申请(专利权)人:南京大学
类型:发明
国别省市:江苏;32

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

1