一种用于ECU程序开发的代码智能提示方法及其系统
技术领域
本发明属于汽车控制程序开发技术领域,具体涉及一种用于ECU程序开发的代码智能提示方法及其系统。
背景技术
ECU(Electronic Control Unit,电子控制单元)又称车载电脑。从用途上讲则是汽车专用微机控制器,也叫汽车专用单片机。它和普通的单片机一样,由CPU、ROM、RAM、I/O接口、模数转换器以及整形、驱动等大规模集成电路组成。ECU的功用是根据其内存的程序和数据对空气流量计及各种传感器输入的信息进行运算、处理、判断,然后输出指令,向喷油器提供一定宽度的电脉冲信号以控制喷油量;故要实现上述功能需对ECU进行程序开发编写。
C语言是ECU开发最主要的开发语言,市场上C语言的开发环境也有许多,例如CodeWarrior、Keil、IAR Embedded Workbench等,但是这些开发环境都没有一个比较好的代码提示功能。如今社会竞争激烈,人力资源日益昂贵,如何提高开发效率成为许多公司关注的焦点。用过微软Visual Studio的开发者都对其代码提示和补全功能感到惊叹,Eclipse虽然比不上Visual Studio,但其对Java的智能提示也还算不错。
手写代码有着效率低,出错率高的问题,传统的ECU开发环境中没有针对头文件和源文件中定义的类型和变量进行解析,代码中的每个变量都需要输入完整的名称,并且名称的检查也是在编译的时候进行,编译器发现并报告了哪行的错误之后才进行改正,这样开发效率低下。并且ECU开发中许多代码属于配置性的还有一些代码是用于定义协议报文格式,这类代码结构上往往比较规整并且具有重复性,手动编写的过程中往往带有大量的复制-粘贴操作,这其中可能就留下许多隐患。
C语言和JAVA、C#存在区别,C语言是直接操作内存的语言,而不是建立在虚拟机之上的语言,这就导致虚拟机语言上那套通过反射获得定义信息的做法走不通,造成智能代码提示的实现遇到困难。但好在C语言功能上比较简单,不含有面向对象那一套功能,智能代码提示最主要的目标就是解析结构体的定义。
发明内容
针对现有技术所存在的上述技术缺陷,本发明提供了一种用于ECU程序开发的代码智能提示方法及其系统,能够在用户编写ECU程序代码过程中,智能提示相关代码,提高程序开发的效率。
一种用于ECU程序开发的代码智能提示方法,包括如下步骤:
(1)获取当前用户输入的程序信息;所述的程序信息包括CAN网络(控制器局域网络)数据库、C代码(C语言代码)源文件及其所引用的头文件;
(2)对所述的程序信息进行分析并提取出定义信息,并将所述的定义信息填充到符号表中;jhdjsajka
(3)通过查找所述的符号表对C代码源文件中当前编辑行已输入的变量进行分析,进而根据分析结果确定是否提示给出C代码源文件中当前编辑行最后一变量在符号表中对应结构体所包含的成员。
所述的步骤(2)中,对程序信息进行分析并提取出变量定义信息的过程如下:
a.利用XML解析器对CAN网络数据库进行解析,得到CAN网络数据库内各变量的定义和各结构体的定义;
b.利用ANTLR开源语法分析器对C代码源文件所引用的每个头文件进行分析,得到一棵语法树;
c.自上而下遍历所述的语法树,从中提取每个头文件内各变量的定义和各结构体的定义;
d.根据步骤b和c,对C代码源文件进行同样操作,得到C代码源文件内各变量的定义和各结构体的定义。
变量的定义记录了变量所对应的结构体,结构体的定义记录了结构体所包含的成员。
所述的步骤(3)中,通过查找符号表对C代码源文件中当前编辑行已输入的变量进行分析的过程如下:
a.首先,查找C代码源文件中当前编辑行第一个变量是否在符号表中存在定义:若存在,则执行步骤b;若不存在,则表示当前编辑行无需自动提示;
b.判断存在定义的当前变量的下一变量是否为空:若是,则表示当前编辑行需自动提示;若否,则执行步骤c;
c.从符号表中读取当前变量对应的结构体所包含的成员,判断当前变量的下一变量是否为当前变量的成员:
若是,则查找下一变量是否在符号表中存在定义:若存在,则将下一变量作为存在定义的当前变量,并返回步骤b;若不存在,则表示当前编辑行无需自动提示;
若否,则表示当前编辑行无需自动提示。
一种用于ECU程序开发的代码智能提示系统,包括:
XML解析器,用于对CAN网络数据库进行解析,得到CAN网络数据库内各变量的定义和各结构体的定义;
ANTLR开源语法分析器,用于对C代码源文件及其所引用的每个头文件进行分析,提取C代码源文件内各变量的定义和各结构体的定义以及每个头文件内各变量的定义和各结构体的定义;
符号表,用于存放XML解析器和ANTLR开源语法分析器所提取得到的定义信息;
查表分析模块,用于通过查找符号表对C代码源文件中当前编辑行已输入的变量进行分析,并输出分析结果;
智能提示模块,用于根据分析结果确定是否提示给出C代码源文件中当前编辑行最后一变量在符号表中所包含的成员。
本发明解决在ECU开发中智能提示不足,开发效率低的问题,主要包括智能提示和代码生成。智能提示基于对现有CAN网络数据库文件和已有代码的分析,验证当前编辑行是否符合语法规则,对于符合语法规则的结合上下文环境给出智能提示,帮助开发人员快速开发,避免由复制、粘贴带来的潜在错误。
附图说明
图1为本发明代码智能提示方法的步骤流程图。
图2为符号表的构建示意图。
图3为本发明代码智能提示系统的结构示意图。
具体实施方式
为了更为具体地描述本发明,下面结合附图及具体实施方式对本发明方法及其系统进行详细说明。
如图1所示,一种用于ECU程序开发的代码智能提示方法,包括如下步骤:
(1)获取当前用户输入的程序信息;
程序信息包括CAN网络数据库、C代码源文件及其所引用的头文件;
CAN网络数据库是由整车厂商提供的一个描述CAN网络上各ECU通讯所定义的协议,其中包含信息Message和信号Signal,在C语言的实现上每一个Signal定义成一种基本数据类型,而每一个Message定义成一个结构体,结构体中又包含了若干个Signal。
(2)如图2所示,对程序信息进行分析并提取出定义信息:
1.利用XML解析器对CAN网络数据库进行解析,得到CAN网络数据库内各变量的定义和各结构体的定义;
2.利用ANTLR开源语法分析器对C代码源文件所引用的每个头文件进行分析,根据C语言的文法,对于每一个非终结符都建立一个类来存储该节点的信息,在ANTLR分析的过程中,通过建立一个个非终结符对应的类对象,并且由节点的引用关系构建这些对象间的引用关系,最终得到一棵对象描述的语法树;
3.根据已经得到的语法树,采用自上而下深度优先的遍历算法,遍历语法树中的每一个节点,从中提取每个头文件内各变量的定义和各结构体的定义;
4.根据步骤2和3,对C代码源文件进行同样操作,得到C代码源文件内各变量的定义和各结构体的定义。
最后,并将定义信息填充到符号表中;由于C语言包含各种作用域,因此每一个作用域都包含一个对应的变量定义的符号表,其中主要包括全局符号表,而每一个函数都有其对应的局部符号表。
(3)通过查找符号表对C代码源文件中当前编辑行已输入的变量进行分析:
1.首先,查找C代码源文件中当前编辑行第一个变量是否在符号表中存在定义:若存在,则执行步骤2;若不存在,则表示当前编辑行无需自动提示;
如前面所述,对于变量的定义包含了全局符号表,并且每一个函数都有局部的符号表,因此查找当前变量的时候,首先到当前函数对应的符号表中查找,若查到,将查找结果返回,查找结束;若未查到,再到全局符号表中查找,若查到,将查找结果返回,若未查到,则当前变量不存在定义,错误返回;
2.判断存在定义的当前变量的下一变量是否为空:若是,则表示当前编辑行需自动提示;若否,则执行步骤3;
3.从符号表中读取当前变量对应的结构体所包含的成员,判断当前变量的下一变量是否为当前变量的成员:
若是,则查找下一变量是否在符号表中存在定义:若存在,则将下一变量作为存在定义的当前变量,并返回步骤2;若不存在,则表示当前编辑行无需自动提示;
若否,则表示当前编辑行无需自动提示。
根据分析结果确定是否提示给出C代码源文件中当前编辑行最后一变量在符号表中对应结构体所包含的成员。提示的过程中除了要匹配变量的名称,还要匹配变量的类型:对于基本数据类型的变量和指向它们的指针,则不需要提示;对于结构体变量在遇到“.”的时候提示其结构体成员,而对于指针变量在遇到“->”的时候提示其结构体成员,而对于“a->”,除了要找到是否存在变量a的定义,还要查看变量a是否是定义为指针,只有变量名称和类型完全匹配的,才算匹配成功,继续匹配下一个变量,否则都错误返回。
下面结合一个例子来说明查询提示过程。假设源代码定义如下:
下面分析d,d.ptoxx->、d.ptoxx->a.的解析过程:
遇到d时候查询,查询符号表,发现d的类型是yy,并且d已经是最后一个词,这时候给出yy的成员提示ptoxx和c。
遇到d.ptoxx,首先拿d查符号表,知道d是yy类型,分析第二个词是ptoxx,而d的成员中确实有个叫ptoxx的,匹配,继续查询ptoxx的类型定义是struct xx,因为已经是最后一个单词,并且ptoxx之后是->而ptoxx正好是指针类型所以给出struct xx的成员a和b。
遇到d.ptoxx->a,到d.ptoxx->的解析过程如上一步,之后遇到a,发现ptoxx确实有成员名叫a,后面是一个.,但是a是基本类型int,不是结构体,因此没有成员,返回空。
如图3所示,一种用于ECU程序开发的代码智能提示系统,包括:XML解析器、ANTLR开源语法分析器、符号表、查表分析模块和智能提示模块;其中:
XML解析器用于对CAN网络数据库进行解析,得到CAN网络数据库内各变量的定义和各结构体的定义;
ANTLR开源语法分析器用于对C代码源文件及其所引用的每个头文件进行分析,提取C代码源文件内各变量的定义和各结构体的定义以及每个头文件内各变量的定义和各结构体的定义;
符号表用于存放XML解析器和ANTLR开源语法分析器所提取得到的定义信息;
查表分析模块用于通过查找符号表对C代码源文件中当前编辑行已输入的变量进行分析,并输出分析结果;
智能提示模块用于根据分析结果确定是否提示给出C代码源文件中当前编辑行最后一变量在符号表中所包含的成员。
xML解析器、ANTLR开源语法分析器、查表分析模块和智能提示模块均通过计算机编程实现。