将代码注释转换为过程规范( 四 )


? 句子不完整:如果没有主从句,Jdoctor 会将从属从句转换为主从句 。
? 词汇标准化:为了适应以后的模式匹配,Jdoctor 标准化了与 null、if 和 empty 模式有关的文本 。例如,Jdoctor 将“ non-null”和“ nonnull”标准化为“ not null” 。
? 数学符号:Jdoctor 将不等式转换为可以解析为形容词的占位符 。例如,如果{@code e} <0,则 Jdoctor 将子句转换为表达式 e <0,并进一步转换为 e is LT0 。
4.2 命题识别给定一个英语句子,Jdoctor 会识别<主语,谓语>对,也称为命题 [14],以及连接命题(如果有)的连接词或析取词 。从自然语言句子中提取<主语,谓语>对称为开放信息提取(OIE)[1, 14, 18, 46] 。
? Jdoctor 首先执行部分 POS 标记 [41] 。它将参数名称标记为名词,将不等号占位符(例如 LT0)标记为形容词 。Jdoctor 通过 Stanford Parser [34]完成 POS 标记过程,该过程产生代表输入语句的语义图(丰富的分析树) 。语义图的节点对应于句子的单词,边缘对应于单词之间的语法关系 。
? Jdoctor 根据句子结构和图中编码的语法角色,识别构成主题的单词和构成谓词的单词 。更精确地讲,给定在语义图中被标记为主题的单个节点(即单词),Jdoctor 通过访问以主题节点为根节点的子图并收集涉及复合类型关系的所有单词来识别完整的主题短语、状语修饰语、形容词修饰语、确定语和名词修饰语 。这与 ALICS [41]完全不同,ALICS 仅使用由 Stanford Parser 提供的即用型 POS 标记,因此缺少所有其他词的信息 。Jdoctor 通过收集具有以下语法关系的单词来识别谓语:助词、系词、合词、直接宾语、开放式补语以及形容词、否定词和数字修饰语 。
? Jdoctor 从简单句子中提取一个命题,从多子句中提取多个命题 。通过处理语义图中诸如“和”和“或”之类的语法连接的专用边缘,Jdoctor 可以正确支持多子句 。在遍历图时,Jdoctor 会确定与正确的布尔连词或析取词相互关联的命题,这些命题反映了输入句子中的语法连词 。
4.3 命题翻译Jdoctor 通过连续应用模式匹配(第 4.3.1 节)和词汇匹配(第 4.3.2 节)的补充启发式方法并结合语义相似性分析(第 4.3.3 节)来翻译每个命题 。Jdoctor 使用第一个能翻译成功的方法 。
? 本节描述单个命题的翻译 。Jdoctor 通过根据输入注释中的语法连接(“或”,“和”)合并组件命题的翻译来处理多个命题 。
? 算法 1 显示 Jdoctor 如何处理 Javadoc 注释的(规范化)文本 。文本可能包含多个命题 。该算法独立地翻译每个命题 。然后,将这些翻译(它们是 Java 表达式和操作)重新组合以创建完整的可执行规范 。对@return注释会进行特殊重组 。Jdoctor 首先确定 guard、true 属性和 false 属性 。例如,Apache Commons Collections 中ArrayStack.search()的返回注释是“对象堆栈中从 1 开始的深度,如果找不到,则为-1” 。Jdoctor 将“如果未找到”标识为 guard 对象,将“从对象的堆栈开始的基于 1 的深度”标识为 true 属性,即,当 guard 为 true 时保留的属性,而将“ -1”标识为 false 属性,即将 guard 评估为 false 时保留的属性 。

将代码注释转换为过程规范

文章插图
 
? 将命题转换为 Java 表达式时(第 15 行),Jdoctor 尝试匹配每个主题并断言为代码元素 。从直觉上讲,名词对应于对象,在源代码中以表达式表示对象,而动词对应于动作或谓词,在源代码中以操作符表示 。
? Jdoctor 首先分析命题的主题(第 17 行),然后尝试将该主题与代码元素进行匹配,该代码元素可以是方法的参数,类的字段或类本身 。Jdoctor 检索范围内所有代码元素的标识符和类型作为候选者,并寻找最佳匹配 。例如,当在第 3 节中处理注释“如果比较器为空”时,Jdoctor 将主题“比较器”与类型为Comparator的方法的参数匹配 。Jdoctor 通过词法匹配来实现此任务,我们将在 4.3.2 节中对此进行说明 。
如果 Jdoctor 找到主题的匹配表达式,它将继续寻找相应的匹配谓词(例如示例中的“ is null”) 。更详细地讲,Jdoctor 检索主题范围内所有公共方法和字段的代码标识符,以作为可能的候选者 。例如,在将主题比较器匹配为Comparator类型之后,Jdoctor 检索公共方法的完整列表和Comparator类的字段作为可能的候选对象 。一旦确定了可能的候选者,Jdoctor 就会逐步利用一组启发式方法来推断可能候选者中谓词与代码元素的正确匹配:(i)检查谓词是否与一组预定义翻译(行)匹配 22),(ii)查找词汇相似的匹配项(第 24 行),(iii)根据语义相似性搜索匹配项(第 27 行) 。


推荐阅读