掌桥专利:专业的专利平台
掌桥专利
首页

一种基于ANTLR4的源码翻译方法

文献发布时间:2023-06-19 10:06:57


一种基于ANTLR4的源码翻译方法

技术领域

本发明属于翻译方法技术领域,尤其涉及一种基于ANTLR4的源码翻译方法。

背景技术

为了能更加方便、直观的对一个工程进行翻译操作,一般需要将工程源代码的语言表现形式转变成目标语言表现形式,而ANTLR4就把此过程变的更加简单。ANTLR4是一款强大的语法生成器工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件,它被广泛应用于学术领域和工业生产实践。ANTLR4具有自己规定的语法规则,一般情况下,用户可根据语法规则编写对应的.g4文件,ANTLR4读取.g4内容后,可以解析.g4文件描述的文件格式,并生成语法树。如图1所示,ANTLR4解析过程主要分为两步:首先是为该语言生成一个词法分析器(lexer),lexer是将输入的文本转化为词法符号的程序,然后是根据词法符号识别语句结构以生成语法树(parsetree)的数据结构,该数据结构记录了词法分析器识别输入语句结构的过程以及该结构的组成部分。用户可通过遍历语法树的所有节点,然后根据目标语言的结构、业务逻辑,重构替换生成一棵新的语法树,并输出出来,这样就完成了一种语言到另一种语言的翻译。

然而,当前利用ANTLR4对一个工程的翻译通常采用串行机制,处理完一个文件后再处理另一个文件,在翻译大型开源项目时所需执行时间长,存在执行效率低的问题。而且,当前很多工程的源代码不仅仅只有一种编程语言,也可能是多种语言,结构较为复杂,仅采用模式单一的串行解析已经无法满足翻译需求。

发明内容

本发明针对现有ANTLR4翻译方法在翻译时存在的上述不足,提出一种基于ANTLR4的源码翻译方法,其基于多线程机制,翻译效率高,且支持多语言解析。

为了达到上述目的,本发明采用的技术方案为:

一种基于ANTLR4的源码翻译方法,包括如下步骤:

(1)对待翻译工程所包含的源码文件按照语言种类进行分类,分析不同种类源码文件之间的调用关系并保存,建立与源码文件种类数相同数量的待解析目录,将不同种类的源码文件分别放入不同的待解析目录中;

(2)建立与源码文件种类数相同数量的预处理线程,通过调度线程将不同待解析目录中的源码文件分别调入不同的预处理线程中;

(3)不同的预处理线程并行进行分析,每个预处理线程分析调入的同种类源码文件之间的依赖关系并保存,根据该类源码文件之间的依赖关系确定该类源码文件的解析顺序,并将解析顺序保存到列表文件中,计算得到该类源码文件对应的应输出解析文件个数;汇总所有预处理线程计算得到的应输出解析文件个数,获得应输出解析文件总数;

(4)建立多个解析线程,解析线程的数量大于或等于源码文件种类数,不同的解析线程分别读取不同的列表文件,不同的解析线程并行进行解析;每个解析线程按照其读取的列表文件所记录的解析顺序,从待解析目录中逐一调取源码文件,利用ANTLR4解析出语法树,利用语法树翻译源码文件并输出对应的解析文件;

(5)待所有解析线程完成解析后,判断输出的解析文件总数与应输出解析文件总数是否相等;

(6)若步骤(5)的判断结果为相等,则翻译结束;若步骤(5)的判断结果为不相等,则重复步骤(2)~(6),直到输出的解析文件总数与应输出解析文件总数相等为止;

(7)根据不同种类源码文件之间的调用关系和同种类源码文件之间的依赖关系,整合输出的解析文件,得到翻译结果。

作为优选,步骤(1)中,在将不同种类的源码文件放入不同的待解析目录后,还包括根据源码文件的处理状态为每个源码文件添加flag标识字段的步骤,flag取值为0或1或2,其中,flag值为0标识未解析状态,flag值为1标识解析中状态,flag值为2标识已解析状态。

作为优选,步骤(4)中,解析线程仅调取flag值为0的源码文件,且取到后将该源码文件的flag值改为1,翻译完成后再将该源码文件的flag值改为2。

作为优选,步骤(5)中,所有解析线程完成解析的判断方法为:判断所有源码文件的flag值是否均为2,若是,则所有解析线程完成解析,若否,则存在解析线程未完成解析。

作为优选,步骤(7)中,在整合输出的解析文件后,还包括对整合文件进行预览和调试的步骤。

与现有技术相比,本发明的优点和有益效果在于:

1、本发明提供的基于ANTLR4的源码翻译方法,针对不同语言种类的源码文件进行分类,并通过设计的调度线程、预处理线程和解析线程的协同合作,实现了对多语言的并行解析功能,提高了对复杂工程的翻译效率;

2、本发明提供的基于ANTLR4的源码翻译方法,分析了不同语言的源码文件之间的调用关系以及源码文件之间的依赖关系,待翻译完成后根据调用关系和依赖关系能够自动融合解析文件,无需人工组合,进一步提高了对复杂工程的翻译效率。

附图说明

图1为现有ANTLR4的解析过程示意图;

图2为本发明实施例提供的基于ANTLR4的源码翻译方法的解析过程示意图;

图3为本发明实施例提供的基于ANTLR4的源码翻译方法的流程图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行描述和说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。基于本申请提供的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。

显而易见地,下面描述中的附图仅仅是本申请的一些示例或实施例,对于本领域的普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图将本申请应用于其他类似情景。此外,还可以理解的是,虽然这种开发过程中所作出的努力可能是复杂并且冗长的,然而对于与本申请公开的内容相关的本领域的普通技术人员而言,在本申请揭露的技术内容的基础上进行的一些设计,制造或者生产等变更只是常规的技术手段,不应当理解为本申请公开的内容不充分。

如图2所示,本发明实施例涉及一种基于ANTLR4的源码翻译方法,包括如下步骤:

(1)对待翻译工程所包含的源码文件按照语言种类进行分类,分析不同种类源码文件之间的调用关系并保存,建立与源码文件种类数相同数量的待解析目录,将不同种类的源码文件分别放入不同的待解析目录中。需要说明的是,语言种类包括JAVA、C++、C、Python、C#、fortran等各种现有语言。

(2)建立与源码文件种类数相同数量的预处理线程,通过调度线程将不同待解析目录中的源码文件分别调入不同的预处理线程中。

(3)不同的预处理线程并行进行分析,每个预处理线程分析调入的同种类源码文件之间的依赖关系并保存,根据该类源码文件之间的依赖关系确定该类源码文件的解析顺序,并将解析顺序保存到列表文件中,计算得到该类源码文件对应的应输出解析文件个数;汇总所有预处理线程计算得到的应输出解析文件个数,获得应输出解析文件总数。

(4)建立多个解析线程,解析线程的数量大于或等于源码文件种类数,不同的解析线程分别读取不同的列表文件,不同的解析线程并行进行解析;每个解析线程按照其读取的列表文件所记录的解析顺序,从待解析目录中逐一调取源码文件,利用ANTLR4解析出语法树,利用语法树翻译源码文件并输出对应的解析文件。需要说明的是,利用ANTLR4翻译源码文件的具体步骤为本领域技术人员所熟知,其过程包括:根据先前编写好的.g4文件,进而解析成一个自顶向下的语法树ParseTree,树中的每个节点都对应着程序中的某个代码片段,然后用户根据目标语言的规则对ParseTree所有节点进行遍历、重构和替换,形成一棵新的语法树,进而输出得到解析文件。

(5)待所有解析线程完成解析后,判断输出的解析文件总数与应输出解析文件总数是否相等。

(6)若步骤(5)的判断结果为相等,则翻译结束;若步骤(5)的判断结果为不相等,则重复步骤(2)~(6),直到输出的解析文件总数与应输出解析文件总数相等为止。

(7)根据不同种类源码文件之间的调用关系和同种类源码文件之间的依赖关系,整合输出的解析文件,得到翻译结果。

上述基于ANTLR4的源码翻译方法,针对不同语言种类的源码文件进行分类,并通过设计的调度线程、预处理线程和解析线程的协同合作,实现了对多语言的并行解析功能,提高了对复杂工程的翻译效率。同时,上述基于ANTLR4的源码翻译方法,分析了不同语言的源码文件之间的调用关系以及源码文件之间的依赖关系,待翻译完成后根据调用关系和依赖关系能够自动融合解析文件,无需人工组合,进一步提高了对复杂工程的翻译效率。

为了进一步提高解析效率,作为优选,步骤(1)中,在将不同种类的源码文件放入不同的待解析目录后,还包括根据源码文件的处理状态为每个源码文件添加flag标识字段的步骤,flag取值为0或1或2,其中,flag值为0标识未解析状态,flag值为1标识解析中状态,flag值为2标识已解析状态。步骤(4)中,解析线程仅调取flag值为0的源码文件,且取到后将该源码文件的flag值改为1,翻译完成后再将该源码文件的flag值改为2。步骤(5)中,所有解析线程完成解析的判断方法为:判断所有源码文件的flag值是否均为2,若是,则所有解析线程完成解析,若否,则存在解析线程未完成解析。通过添加的flag标识字段并根据源码文件的处理状态实时更新,确保了同一时刻只有一个解析线程能够访问同一源码文件,同时便于实现解析完成与否的判断,有利于提高解析效率。

此外,步骤(7)中,在整合输出的解析文件后,还包括对整合文件进行预览和调试的步骤,以确保输出满意的翻译结果。

相关技术
  • 一种基于ANTLR4的源码翻译方法
  • 一种基于antlr4的代码生成器设计方法
技术分类

06120112423151