1.本发明涉及代码分析领域,具体是一种代码结构视图解析及预览方法。
背景技术:
2.代码结构视图是开发人员在ide中开发代码时,ide会同时给出当前代码的总体组成结构:比如包含哪些类声明,方法、函数声明以及对应的参数返回值等签名信息,全局声明语句等,让开发人员对当前代码的总体结构有个全局的预览,方便开发工作。
3.ide中代码结构视图采用的技术一般是基于具体语言的代码抽象语法树(ast)进行解析的,抽象语法树即基于文本代码转换得到的树形结构,每个节点都会对应到具体的代码,包括行信息、语句类型,上下文以及子节点等信息。代码从文本到转换成计算机可执行的程序一般都会经过词法分析、语法分析的过程,进而得到抽象语法树,再进行后续编译、执行。
4.代码结构视图一般是在开发人员本地ide(开发工具)中集成展示的,但是在目前市面上常见的saas代码托管平台中,其代码浏览页面尚未有代码总体结构视图展示功能,不太方便代码结构实时预览以及目标代码定位。并且,现有技术实现基于抽象语法树:需要将代码文本转化为树形结构进行存储和遍历,比较复杂,且解析效率相对较低。
技术实现要素:
5.本发明的目的在于提供一种代码结构视图解析及预览方法,以解决上述背景技术中提出的问题。
6.为实现上述目的,本发明提供如下技术方案:
7.一种代码结构视图解析及预览方法,包括代码预处理模块、代码解析模块、结果处理模块和结果存储模块;
8.所述代码预处理模块用于接收请求方传递的代码文件,确定代码文件语言类型,计算代码文件内容md5,判断是否已有历史分析结果;
9.所述代码解析模块用于分析代码文件,结合代码文件所涉及的语言类型进行解析,从而获得语法解析树;并基于语法解析树的访问者模式,从代码文件语法入口规则开始进行解析,得到代码结构分析结果;
10.所述结果处理模块用于解析代码结构分析结果,通过结构化的方式进行描述,并将结构化结果进行持久化存储,同时将代码结构分析结果返回给请求方进行展示;结构化结果按照代码内容的md5为键值进行存储,若请求的代码内容md5在历史分析结果中已存在则不用重复分析;
11.所述结果存储模块用于存储结构化结果,方便查询;
12.具体步骤如下:
13.步骤一:首先在代码浏览页面,由请求方发起解析代码文件的代码结构请求,将代码文件传递至代码解析服务;
14.代码预处理模块接收请求方发送的代码文件,以及代码文件相关参数,并对接收内容进行预处理:分析代码文件所属语言类型、计算代码文件md5、计算代码文件大小、分析代码文件的代码内容;
15.通过md5判断当前代码文件是否已有历史分析记录,如果已分析过,可直接查询历史分析结果并返回;如果未分析过,则进行下一步;
16.步骤二:针对步骤一得到的代码内容和语言类型,调用该语言基于antlr4生成的词法、语法分析程序进行词法解析以及语法解析,得到语法解析树;并从该语言语法描述的入口规则基于访问者模式对代码结构进行分析;
17.仅分析代码文件结构相关的规则,对于不关注的子规则不进行分析;当分析到函数声明语句时,仅分析函数名以及函数签名;
18.通过访问者模式有针对性的分析顶层节点及其子节点即可获得代码的结构;如果是函数声明语句,可进一步基于语法解析树节点的上下文信息获取函数名以及函数参数返回值,以及函数所在文件路径、行号;
19.在遇到代码文件中包含语法错误时,根据antlr4的特性仍可以生成语法解析树,保证分析程序可以继续正常进行分析,从而得到代码文件的代码结构;
20.在分析过程中,由结果处理模块对代码结构分析结果进行收集,收集的信息包含当前分析文件的类声明语句及其相关信息,结构体声明及其相关信息,函数、方法声明语句及其相关信息;
21.步骤三、步骤二中分析所得的结构化结果以文件md5为键值进行存储,同时将代码结构分析结果返回给请求方;
22.步骤四、请求方收到代码结构解析结果,由代码平台进行代码结构视图展示,从而实现代码结构视图在线实时预览,基于语句的文件、行号进行代码跳转、定位。
23.作为本发明进一步的方案:所述代码解析模块包括基于antlr4和各常用开发语言的语法描述文件,生成常用开发语言的词法、语法分析程序,以及语法解析树遍历程序。
24.作为本发明进一步的方案:所述代码结构分析结果包含的信息有:文件的包声明、模块声明、依赖模块导入声明、类定义、结构体定义、函数定义、函数参数列表、全局变量声明、常量声明。
25.作为本发明进一步的方案:所述结构化结果包含的信息有:代码文件结构中各语句的代码内容、所属行号、列号,词法类型。
26.与现有技术相比,本发明的有益效果是:
27.本发明采用上述方法后,可实现支持几乎所有主流语言文件代码结构视图在线预览,并支持目标代码跳转、定位,显著提高代码阅读效率,提升易用性。用户在代码平台浏览某语言代码文件时,可基于本发明进行实时解析,获得当前文件的代码总体结构视图进行展示,用户可清晰知道当前文件包含哪些类、方法、函数,全局变量声明等总览信息。点击某个结构体或方法,可实时定位到该对象对应的代码行进行浏览。
附图说明
28.图1为一种代码结构视图解析及预览方法的流程图。
具体实施方式
29.下面结合具体实施方式对本专利的技术方案作进一步详细地说明。
30.请参阅图1,一种代码结构视图解析及预览方法,包括代码预处理模块、代码解析模块、结果处理模块和结果存储模块;所述代码预处理模块用于接收请求方传递的代码文件或者代码文本内容,确定代码文件语言类型,计算代码文件内容md5,判断是否已有历史分析结果。所述代码解析模块用于分析代码文件,结合代码文件所涉及的语言类型进行解析,从而获得语法解析树;并基于语法解析树的访问者模式,从代码文件语法入口规则开始进行解析,得到代码结构分析结果。
31.所述代码解析模块包含基于antlr4和各常用开发语言的语法描述文件(.g4后缀),生成常用开发语言的词法、语法分析程序,以及语法解析树遍历程序。所述代码结构分析结果一般包含的信息有(不同的语言根据语法不同会略有不同):文件的包声明、模块声明、依赖模块导入声明、类定义、结构体定义、函数定义、函数参数列表、全局变量声明、常量声明等语句。
32.所述结果处理模块用于解析代码结构分析结果,通过结构化的方式进行描述,并将结构化结果进行持久化存储,同时将代码结构分析结果返回给请求方进行展示;结构化结果按照代码内容的md5为键值进行存储,若请求的代码内容md5在历史分析结果中已存在则不用重复分析;所述结构化结果包含的信息有:代码文件结构中各语句的代码内容、所属行号、列号,词法类型等。所述结果存储模块用于存储结构化结果,方便查询。
33.具体步骤如下:
34.步骤一:首先在代码浏览页面,由请求方(代码托管方)发起解析代码文件的代码结构请求,将代码文件或者代码文本内容传递至代码解析服务;
35.代码预处理模块接收请求方发送的代码文件或者代码文本内容,以及代码文件相关参数(文件名,所属语言等),并对接收内容进行预处理:分析代码文件所属语言类型、计算代码文件md5、计算代码文件大小、分析代码文件的代码内容;
36.通过md5判断当前代码文件是否已有历史分析记录,如果已分析过,可直接查询历史分析结果并返回(历史分析结果在步骤三中保存);如果未分析过,则进行下一步;
37.步骤二:针对步骤一得到的代码内容和语言类型,调用该语言基于antlr4生成的词法、语法分析程序进行词法解析以及语法解析,得到语法解析树;并从该语言语法描述的入口规则基于访问者模式对代码结构进行分析;
38.仅分析代码文件结构相关的规则,对于不关注的子规则不进行分析;当分析到函数声明语句时,仅分析函数名以及函数签名等信息,代码结构不关注函数体内部的细节,针对函数体可以不分析,即不用访问函数体规则及其子规则;
39.举例:go语言其语法解析树的入口规则为sourefile,表示一个文件语法解析树的最顶层节点。包含packageclause,importdecl,functiondecl|methoddecl|declaration等子规则,分别对应:包声明,模块导入,以及函数声明、方法声明、其他声明语句,而这些声明语句即代表这个文件的整体结构。其他语言采用类似分析方法,以该语言语法文件的入口规则开始解析,仅分析入口规则以及子规则即可。
40.通过访问者模式有针对性的分析顶层节点及其子节点即可获得代码的结构,即代码文件中包含哪些函数声明语句、方法声明语句、以及其他全局声明语句;如果是函数声明
语句,可进一步基于语法解析树节点的上下文信息获取函数名以及函数参数返回值等签名信息,以及函数所在文件路径、行号;方法声明以及其他声明语句类似可获取对应的信息;
41.在遇到代码文件中包含语法错误时,根据antlr4的特性仍可以生成语法解析树,保证分析程序可以继续正常进行分析,从而得到代码文件的代码结构;
42.在分析过程中,由结果处理模块对代码结构分析结果进行收集,收集的信息包含当前分析文件的类声明语句及其相关信息,结构体声明及其相关信息,函数、方法声明语句及其相关信息,其他全局声明语句及其相关信息;
43.步骤三、步骤二中分析所得的代码结构信息以文件md5为键值进行存储,同时将代码结构分析结果返回给请求方;
44.步骤四、请求方收到代码结构解析结果,由代码平台进行代码结构视图展示,从而实现代码结构视图在线实时预览,基于语句的文件、行号等相关信息进行代码跳转、定位。
45.本发明的工作原理是:本发明将基于antlr4(一款开源的语法解析工具,可用于构建新语言、开发工具或者框架),来进行代码语法分析并得到语法解析树,基于语法解析树来解析代码结构,进而生成代码结构预览视图;
46.在使用场景上,可用于除ide之外的任意代码预览场景,包括但不限于代码托管saas平台在线展示代码结构,还可支持目标代码结构定位跳转,方便开发人员预览代码。
47.在技术实现上,本方法对比基于抽象语法树的分析方法,有以下改进点:
48.1、不必依赖某语言的抽象语法树,也不用对整个语法树进行遍历即可完成代码结构分析,提升分析效率。
49.基于antlr4工具以及各语言语法描述文件可生成代码词法解析、语法解析代码程序以及生成语法解析树的访问程序,通过生成的代码程序可解析目标代码生成语法解析树cst(语法解析树是根据anlr4的语法描述文件(.g4后缀)中的规则经过语法解析后获得的带有上下文信息的结构)
50.antlr4提供了两种解析树的处理模式:监听模式以及访问者模式,本方法将采用访问者模式。
51.监听模式会自动遍历整个解析树,遍历到每个树节点时会通知监听方,从而完成监听方设定的分析动作,这个过程类似对整个抽象语法树(ast)的遍历分析,包括各个子节点。因为现在仅关注文件的整体结构,对函数或方法的细节并不关注,可不深入分析,所以针对代码结构解析来讲监听模式会做很多无用的遍历。而基于访问者模式不必遍历所有的子节点,可自主控制分析程序需要分析的子节点,只针对特定类型的节点进行分析。
52.2、可以正常分析包含语法错误的文件,基于antlr4语法解析过程中的自修复特性可继续完成语法解析,而基于抽象语法树因为遇到语法错误则不能正确生成抽象语法树,从而不能继续分析。
53.常规的抽象语法树生成模块在解析代码文件时一旦遇到语法错误时就不能正确生成抽象语法树,也就不能基于抽象语法树完成后续的代码分析。
54.而antlr4工具在词法解析过程中,对于不符合语法规范的地方,会通过前置探测的技术匹配下一个符合预期的词法符号,进而能进行后续的词法解析以及语法解析从而得到语法解析树,以满足后续代码分析。
55.3、可以基于一套框架完成几乎所有语言的分析。如果基于抽象语法树技术则需要
根据具体的语言采用对应语言的技术栈来获取抽象语法树结构才能进行分析,开发成本较高。
56.目前antlr4开源工具已经支持几乎所有常见语言的语法规则描述文件,基于这些描述文件可以通过antlr4命令快速生成特定语言的词法、语法解析文件,并且提供多种开发语言的运行时库,开发者可以基于某一种语言实现其他语言的代码分析程序。(如:可以基于go语言,结合antlr4的go语言运行时,实现对c ,java,php,go,python等代码的分析程序。这样可以基于同一套框架开发分析程序,也不需要根据不同语言切换技术栈,从而减小开发成本。如果基于抽象语法树分析,在分析go语言代码时需要基于go语言的ast模块生成抽象语法树,并且要基于go语言开发分析程序;在分析python语言代码时需要切换到python语言进行开发,每分析一种语言就要使用新的技术栈。)
57.上面对本专利的较佳实施方式作了详细说明,但是本专利并不限于上述实施方式,在本领域的普通技术人员所具备的知识范围内,还可以在不脱离本专利宗旨的前提下做出各种变化。
转载请注明原文地址:https://tc.8miu.com/read-3130.html