CN113900631A - 一种基于antlr4的代码生成器设计方法 - Google Patents
一种基于antlr4的代码生成器设计方法 Download PDFInfo
- Publication number
- CN113900631A CN113900631A CN202111238863.9A CN202111238863A CN113900631A CN 113900631 A CN113900631 A CN 113900631A CN 202111238863 A CN202111238863 A CN 202111238863A CN 113900631 A CN113900631 A CN 113900631A
- Authority
- CN
- China
- Prior art keywords
- file
- generating
- java
- idl
- antlr4
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/37—Compiler construction; Parser generation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及一种基于antlr4的代码生成器设计方法,属于代码生成领域。本发明生成IDL语法规则文件对应的词法分析器和语法分析器;对IDL文件进行预处理,通过词法分析器和语法分析器将预处理后的IDL文件生成语法分析树,并进一步将语法分析树生成结构化数据;定义生成C/C++、JAVA文件的公共接口文件;C/C++、JAVA公共接口文件读取工程模板文件,并用步骤S2中的结构化数据替换模板文件中的结构化数据,生成C/C++、JAVA工程文件。本发明实现跨平台跨语言的数据分发服务的应用。
Description
技术领域
本发明属于代码生成领域,具体涉及一种基于antlr4的代码生成器设计方法。
背景技术
为了提高国产化计算平台的计算能力,适应大数据分析中计算量大的需求,分布式系统以其独特的优势得到了广泛的应用。在分布式系统中,计算平台负责人工智能深度学习算法的计算,包括图像处理,语音分析,模式识别等,主机实现任务的调度,数据的接收和显示。数据分发服务(DDS)就是一种发布订阅的数据传输方式,不仅定义了以数据为中心的发布订阅模型,为分布式系统提供了数据发布订阅机制,而且提供了服务质量(QoS)服务,满足了分布式系统中异步、松耦合的要求,保证了数据分布的实时性。DDS的底层代码是通过IDL(Interface Definition Language)实现的,用户需要使用IDL对数据结构和属性的接口进行定义,并通过代码识别工具将定义好的IDL接口映射到C/C++、Java等多种常用的编程语言,实现了数据接口与编程语言的隔离,满足了分布式系统跨平台跨语言的要求。
Antlr4是一款强大的语法分析器工具,可以识别、处理、翻译结构化的文本、二进制文件甚至XML文件。他提供了一个框架,可以包含Java、c++动作的语法描述来构造语言识别器,编译器和解析器。在antlr4中通过解析用户自定义的上下文无关的文法文件,自动生成词法分析器(Lexer)和语法分析器(Parser),并通过树分析器(Tree Parser)自动将输入文本处理为语法分析树。Antlr4引入的语法分析树的自动创建和遍历机制,极大地提高了语言识别程序的开发效率,能够将开发者从复杂的编译理论中解脱出来。
当下为了提高国产化计算平台的计算能力,适应大数据分析中计算量大的需求,分布式系统以其独特的优势得到了广泛的应用。在分布式系统中,计算平台负责人工智能深度学习算法的计算,包括图像处理,语音分析,模式识别等,主机实现任务的调度,数据的接收和显示。分布式系统中数据传输的方式有多种模式,例如:点到点、消息队列和发布订阅数据传输方式。其中点对点的数据传输方式时间耦合度高,使得数据传输的灵活性差,实时性不好;消息队列的数据传输方式通过消息队列的方式进行数据传输,解决了时间耦合的问题,但是也存在着不能实现异步通信,单点失效,可靠性差等缺点;发布订阅的数据传输方式中数据的发布者和订阅者之间通过主题通信,双方只需定义发布数据的数据结构和类型,不必知道对方的地址,也不用同时在线,具有时间和空间上的松耦合。
数据分发服务(DDS)就是一种发布订阅的数据传输方式,不仅定义了以数据为中心的发布订阅模型,为分布式系统提供了数据发布订阅机制,而且提供了服务质量(QoS)服务,满足了分布式系统中异步、松耦合的要求,保证了数据分布的实时性。DDS的底层代码是通过IDL(Interface Definition Language)实现的,用户需要使用IDL对数据结构和属性的接口进行定义,并通过代码识别工具将定义好的IDL接口映射到C/C++、Java等多种常用的编程语言,实现了数据接口与编程语言的隔离,满足了分布式系统跨平台跨语言的要求。采用发布/订阅的方式,DDS在数据发送者和接收者之间建立了抽象的通信,数据发布者不用知道每一个接收者的地址,只需要将待发布数据按照一定的数据类型发布出去即可。同样,订阅者订阅感兴趣的数据后,不用知道发布的数据是从哪里来,只需要知道自己想要接收数据的数据类型,即可得到想要的数据。
现有的代码生成器功能繁琐,编译后的工程文件太大,可以实现IDL到C/C++、Java等编程语言的映射,但是生成的工程文件只能在特定的编译环境下编译和运行。本文基于antl4设计的代码生成器可以将IDL定义的数据接口类型转化为CMake文件,生成文件小,对编译环境的适应性好,可以实现在Windows/Linux等不同平台下的编译和运行,解决了分布式系统跨平台跨语言数据传输的难题。
发明内容
(一)要解决的技术问题
本发明要解决的技术问题是如何提供一种基于antlr4的代码生成器设计方法,以解决分布式系统跨平台跨语言数据传输的难题。
(二)技术方案
为了解决上述技术问题,本发明提出一种基于antlr4的代码生成器设计方法,该方法包括如下步骤:
S1:生成IDL语法规则文件对应的词法分析器和语法分析器;
S2:对IDL文件进行预处理,通过词法分析器和语法分析器将预处理后的IDL文件生成语法分析树,并进一步将语法分析树生成结构化数据;
S3:定义生成C/C++、JAVA文件的公共接口文件;
S4:C/C++、JAVA公共接口文件读取工程模板文件,并用步骤S2中的结构化数据替换模板文件中的结构化数据,生成C/C++、JAVA工程文件。
进一步地,所述步骤S1具体包括:
S11、定义IDL语法规则文件;
S12、通过antlr4工具,将IDL语法规则文件生成可分析IDL文件的词法分析器和代码语法分析器;
S13、获取词法分析器和语法分析器运行时会调用的ALTAR4-RUNTIME库。
进一步地,所述IDL语法规则文件为.g4文件。
进一步地,所述ANTLR-RUNTIME由antlr4中间件提供,存放于antlr4目录下,其中包含了antlr4-runtime源代码。
进一步地,所述步骤S2具体包括如下步骤:
S21、输入用户自定义的IDL文件;
S22、代码预处理模块处理IDL文件中预处理指令;包含文件处理模块负责加载和处理IDL文件中的包含代码;
S23、通过词法分析器和语法分析器将处理后的IDL文件生成对应的语法分析树;
S24、结构化数据生成模块将生成的语法分析树进一步处理,形成友好的结构化数据。
进一步地,所述预处理指令包括#ifdef、#define、#undef、#else和#endif;所述包含代码包括#include“xxxx.IDL”。
进一步地,所述步骤S3具体包括:
S31、源文件公共接口生成模块由antlr4提供,是C/C++、JAVA文件公共接口的基类,定义了代码文件生成所需的公共接口和属性;
S32、以源文件公共接口生成模块为基础,定义生成C/C++、JAVA文件的公共接口文件,C/C++、JAVA文件公共接口生成模块根据C/C++、JAVA语言特征抽象了并定义了生成C/C++、JAVA文件的公共接口文件。
进一步地,所述C/C++、JAVA文件的公共接口文件包括Type、Type_Plugin、Type_Support、Type_Publisher、Type_Subscriber和CMakeList。
进一步地,所述步骤S4具体包括:
S41、基于DDS的接口规则,定义用于生成C/C++、JAVA的工程模板文件;
S42、C/C++、JAVA公共接口文件读取工程模板文件,并用步骤S2中的结构化数据替换模板文件中的结构化数据,生成对应的C/C++、JAVA工程文件,其中包括Publisher源文件,Subscriber源文件和CMakeList文件。
进一步地,所述步骤S4之后还包括:将C/C++、JAVA工程文件拷贝到Windows/Linux环境下,直接使用CMake命令构建工程,并编译生成可执行文件。
(三)有益效果
本发明提出一种基于antlr4的代码生成器设计方法,将实现订阅/发布数据分发服务(DDS)的用户自定义的数据结构类型另存为IDL文件作为代码生成器的输入,通过代码生成器得到CMake文件,在Windows/Linux环境下使用CMake命令产生工程文件,通过Windows/Linux环境下的编译器生成可执行文件,从而实现跨平台跨语言的数据分发服务的应用。
附图说明
图1为本发明antlr4代码解析的流动过程;
图2为本发明代码生成器软件结构框图;
图3为本发明代码生成器的工作流程图;
图4为本发明代码生成器的GUI界面。
具体实施方式
为使本发明的目的、内容和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
本发明提出了一种基于antlr4的代码生成器,可以将IDL定义的数据接口类型生成CMake脚本文件,从而实现在Windows/Linux等不同平台下的编译和运行,解决了分布式系统跨平台跨语言数据传输的难题。
本发明提出一种基于antlr4的代码生成器,将实现订阅/发布数据分发服务(DDS)的用户自定义的数据结构类型另存为IDL文件作为代码生成器的输入,通过代码生成器得到CMake文件,在Windows/Linux环境下使用CMake命令产生工程文件,通过Windows/Linux环境下的编译器生成可执行文件,从而实现跨平台跨语言的数据分发服务的应用。
如图1所示,本发明提出的一种基于antlr4的代码生成器,antlr4提供一种框架,能够根据用户自定义的文法文件自动生成词法分析器(Lexer)、语法分析器(Parser)和语法分析树(TreeParser),其中词法分析器将输入文本生成词法符号类tokens,并作为语法分析器的输入,语法分析器输出一棵语法分析树。
本发明设计的一种基于antlr4的代码生成器,将实现订阅/发布数据分发服务(DDS)的用户自定义的数据结构类型另存为IDL文件,作为代码生成器的输入,通过代码生成器得到工程文件,在Windows/Linux环境下使用CMake命令构建工程,并编译生成可执行文件,从而实现跨平台跨语言数据分发服务。
代码生成器从设计结构上划分,主要包括四个步骤:生成词法和语法分析器、生成语法分析树并转化为结构化数据、定义生成C/C++及JAVA文件的公共接口文件、生成C/C++及JAVA工程文件,具体步骤如下:
S1:生成IDL语法规则文件对应的词法分析器和语法分析器
S11、定义IDL语法规则文件(.g4文件);
S12、通过antlr4工具,将.g4文件生成可分析IDL文件的词法分析器和代码语法分析器;
S13、词法分析器和语法分析器运行时会调用ALTAR4-RUNTIME库,ANTLR-RUNTIME由antlr4中间件提供,存放于antlr4目录下,其中包含了antlr4-runtime源代码。
S2:对IDL文件进行预处理,通过词法分析器和语法分析器将预处理后的IDL文件生成语法分析树,并进一步将语法分析树生成结构化数据
S21、输入用户自定义的IDL文件;
S22、代码预处理模块处理IDL文件中的预处理指令,包括#ifdef/#define/#undef/#else/#endif等指令;包含文件处理模块负责加载和处理IDL文件中的包含代码,如:#include“xxxx.IDL”;
S23、通过词法分析器和语法分析器将处理后的IDL文件生成对应的语法分析树;
S24、结构化数据生成模块将生成的语法分析树进一步处理,形成友好的结构化数据。
S3:定义生成C/C++、JAVA文件的公共接口文件
S31、源文件公共接口生成模块由antlr4提供,是C/C++、JAVA文件公共接口的基类,定义了代码文件生成所需的公共接口和属性;
S32、以源文件公共接口生成模块为基础,定义生成C/C++、JAVA文件的公共接口文件,C/C++、JAVA文件公共接口生成模块根据C/C++、JAVA语言特征抽象了并定义了生成C/C++、JAVA文件的公共接口文件,主要包括Type、Type_Plugin、Type_Support、Type_Publisher、Type_Subscriber、CMakeList等。
S4:C/C++、JAVA公共接口文件读取工程模板文件,并用步骤S2中的结构化数据替换模板文件中的结构化数据,生成C/C++、JAVA工程文件
S41、基于DDS的接口规则,定义用于生成C/C++、JAVA的工程模板文件;
S42、C/C++、JAVA公共接口文件读取工程模板文件,并用步骤S2中的结构化数据替换模板文件中的结构化数据,生成对应的C/C++、JAVA工程文件;其中包括Publisher源文件,Subscriber源文件、CMakeList文件等其他文件。
将C/C++、JAVA工程文件拷贝到Windows/Linux等不同环境下,可以直接使用CMake命令构建工程,并编译生成可执行文件,从而实现跨平台跨语言的数据分发服务的应用。
其中,GUI(用户界面)通过Qt5作为界面开发工具,给用户提供友好、易用、可跨平台使用的交互界面;辅助模块提供了字符串操作和程序命令行解析等功能的函数接口。
异常处理模块将IDL代码解析过程中存在的错误信息输出到控制台。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
Claims (10)
1.一种基于antlr4的代码生成器设计方法,其特征在于,该方法包括如下步骤:
S1:生成IDL语法规则文件对应的词法分析器和语法分析器;
S2:对IDL文件进行预处理,通过词法分析器和语法分析器将预处理后的IDL文件生成语法分析树,并进一步将语法分析树生成结构化数据;
S3:定义生成C/C++、JAVA文件的公共接口文件;
S4:C/C++、JAVA公共接口文件读取工程模板文件,并用步骤S2中的结构化数据替换模板文件中的结构化数据,生成C/C++、JAVA工程文件。
2.如权利要求1所述的基于antlr4的代码生成器设计方法,其特征在于,所述步骤S1具体包括:
S11、定义IDL语法规则文件;
S12、通过antlr4工具,将IDL语法规则文件生成可分析IDL文件的词法分析器和代码语法分析器;
S13、获取词法分析器和语法分析器运行时会调用的ALTAR4-RUNTIME库。
3.如权利要求2所述的基于antlr4的代码生成器设计方法,其特征在于,所述IDL语法规则文件为.g4文件。
4.如权利要求2所述的基于antlr4的代码生成器设计方法,其特征在于,所述ANTLR-RUNTIME由antlr4中间件提供,存放于antlr4目录下,其中包含了antlr4-runtime源代码。
5.如权利要求2-4任一项所述的基于antlr4的代码生成器设计方法,其特征在于,所述步骤S2具体包括如下步骤:
S21、输入用户自定义的IDL文件;
S22、代码预处理模块处理IDL文件中预处理指令;包含文件处理模块负责加载和处理IDL文件中的包含代码;
S23、通过词法分析器和语法分析器将处理后的IDL文件生成对应的语法分析树;
S24、结构化数据生成模块将生成的语法分析树进一步处理,形成友好的结构化数据。
6.如权利要求5所述的基于antlr4的代码生成器设计方法,其特征在于,所述预处理指令包括#ifdef、#define、#undef、#else和#endif;所述包含代码包括#include“xxxx.IDL”。
7.如权利要求5所述的基于antlr4的代码生成器设计方法,其特征在于,所述步骤S3具体包括:
S31、源文件公共接口生成模块由antlr4提供,是C/C++、JAVA文件公共接口的基类,定义了代码文件生成所需的公共接口和属性;
S32、以源文件公共接口生成模块为基础,定义生成C/C++、JAVA文件的公共接口文件,C/C++、JAVA文件公共接口生成模块根据C/C++、JAVA语言特征抽象了并定义了生成C/C++、JAVA文件的公共接口文件。
8.如权利要求7所述的基于antlr4的代码生成器设计方法,其特征在于,所述C/C++、JAVA文件的公共接口文件包括Type、Type_Plugin、Type_Support、Type_Publisher、Type_Subscriber和CMakeList。
9.如权利要求7或8所述的基于antlr4的代码生成器设计方法,其特征在于,所述步骤S4具体包括:
S41、基于DDS的接口规则,定义用于生成C/C++、JAVA的工程模板文件;
S42、C/C++、JAVA公共接口文件读取工程模板文件,并用步骤S2中的结构化数据替换模板文件中的结构化数据,生成对应的C/C++、JAVA工程文件,其中包括Publisher源文件,Subscriber源文件和CMakeList文件。
10.如权利要求9所述的基于antlr4的代码生成器设计方法,其特征在于,所述步骤S4之后还包括:将C/C++、JAVA工程文件拷贝到Windows/Linux环境下,直接使用CMake命令构建工程,并编译生成可执行文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111238863.9A CN113900631A (zh) | 2021-10-25 | 2021-10-25 | 一种基于antlr4的代码生成器设计方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111238863.9A CN113900631A (zh) | 2021-10-25 | 2021-10-25 | 一种基于antlr4的代码生成器设计方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113900631A true CN113900631A (zh) | 2022-01-07 |
Family
ID=79026420
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111238863.9A Pending CN113900631A (zh) | 2021-10-25 | 2021-10-25 | 一种基于antlr4的代码生成器设计方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113900631A (zh) |
-
2021
- 2021-10-25 CN CN202111238863.9A patent/CN113900631A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110096338B (zh) | 智能合约执行方法、装置、设备及介质 | |
EP2521967B1 (en) | Creating inferred symbols from code usage | |
EP1178404B1 (en) | Method and system for compiling multiple languages | |
Renggli et al. | Embedding languages without breaking tools | |
US8850414B2 (en) | Direct access of language metadata | |
CN111736954B (zh) | 多智能合约虚拟机实现方法、多智能合约虚拟机及系统 | |
US8881123B2 (en) | Enabling symbol resolution of private symbols in legacy programs and optimizing access to the private symbols | |
CN111913741B (zh) | 对象拦截方法、装置、介质及电子设备 | |
CN101458633B (zh) | 通过脚本程序访问宿主程序的方法及其系统和装置 | |
CN115639980A (zh) | 一种低代码平台可拖拽的前端逻辑编排方法及装置 | |
US8032877B2 (en) | Compiler neutral linking solution for C++ code | |
CN111736813A (zh) | Jpa代码的生成方法、装置、终端设备及存储介质 | |
CN113434147B (zh) | 基于ProtoBuf协议的消息解析方法及装置 | |
CN112269566B (zh) | 脚本生成处理方法、装置、设备及系统 | |
CN116360741A (zh) | 小程序开发方法、系统、设备及存储介质 | |
CN113900631A (zh) | 一种基于antlr4的代码生成器设计方法 | |
CN110874213A (zh) | 一静态强类型语言的运行时类型扩展与反射方法 | |
EP3996009A1 (en) | Method and apparatus of converting schema in deep learning freamwork, and computer storage medium | |
CN115390846A (zh) | 编译构建方法、装置、电子设备和存储介质 | |
CN108595166B (zh) | 一种分布式物联网应用执行引擎实现方法及系统 | |
CN112148283A (zh) | 一种跨平台的abi兼容c++组件框架的实现方法 | |
KR100261281B1 (ko) | 엠헥-5의 선언적 기법을 이용한 제이에이브이에이 응용 서비스개발방법 및 시스템 | |
CN113946338A (zh) | 基于rinsim仿真平台的c语言编译方法及装置 | |
CN117950659A (zh) | 一种适用于低代码产品的表达式语言设计方法 | |
CN117827209A (zh) | 函数调用显示方法、装置、存储介质及计算机设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |