多语言代码编译方法及编译器与流程

文档序号:16692557发布日期:2019-01-22 19:02阅读:448来源:国知局
多语言代码编译方法及编译器与流程

本申请涉及语言编译技术领域,特别涉及一种多语言代码编译方法及编译器。



背景技术:

iec61131-3标准是有关可编程控制器的硬件、安装、试验、编程、通讯等方面的国际标准。其中iec61131-3是plc编程语言标准,详细的说明了五种编程语言,其中,包括梯形图(ladderdiagram,ld)、顺序功能流程图(sequentialfunctionchart,sfc)、功能区块图(functionblockdiagram,fbd)、三种图形化语言;还包括指令表(instructionlist,il)、结构化文本(structuredtext,st)两种文本化语言。而iec61131-3标准则作为工控领域的软逻辑编程的行业标准,被广泛应用在各大plc厂商。

现有的基于iec61131-3标准语言的多语言编译器,较简化的编译器是通过增加语言转换器,将多种语言翻译成一种或者少数几种语言源程序,然后由一种或少数几种单语言编译器编译实现,虽然该编译器有所简化,但各功能模块仍有很多冗余,在提升代码效率方面和代码维护方面用户体验不是很好。

申请内容

本申请的目的在于,针对上述现有技术中的不足,提供一种多语言代码编译方法及编译器,提升代码效率和减少代码的维护,并且在iec61131-3编程语言的基础上再增加basic语言的支持。

为实现上述目的,本申请实施例采用的技术方案如下:

第一方面,本申请实施例提供了一种多语言代码编译方法,所述方法包括:

根据预设词法分析规则对源程序代码进行词法分析处理,生成词法分析结果,其中,源程序代码包括多种不同语言的源程序代码;

根据预设语法语义分析规则对词法分析结果进行语法语义分析,生成语法语义分析结果;

根据预设目标代码的生成规则对语法语义分析结果进行目标代码的分析,生成目标代码。

进一步地,源程序代码包括下述至少2种源程序代码:

梯形图语言、顺序功能流程图语言、功能区块图语言、指令表语言、结构化文本语言及basic语言。

进一步地,根据预设词法分析规则对源程序代码进行词法分析处理,生成词法分析结果,包括:

将源程序代码编译所需的头文件代码添加至源程序代码,得到新的源程序代码;

根据预设词法分析规则对新的源程序代码进行词法分析处理并生成词法分析结果;其中,预设词法分析规则包括下述一种或多种组合:分界符类别、运算符类别、标识符类别、注释类别、常量类别或关键字类别规则。

进一步地,根据预设语法语义分析规则对词法分析结果进行语法语义分析,生成语法语义分析结果,包括:

采用变量模型对源程序代码的所述词法分析结果进行语法语义分析,生成变量模型的语法语义分析结果,其中,变量模型包括:单个变量和变量段的定义,变量段的定义包括输入变量段、输出变量段、局部变量段及全局变量段的定义;

采用软件模型对变量模型的语法语义分析结果进行软件模型的语法语义分析,生成软件模型的语法语义分析结果,其中,软件模型的定义包括:软件配置、软件资源及软件任务的定义;

采用程序组织单元模型对所述软件模型的语法语义分析结果进行程序组织单元模型的语法语义分析,生成程序组织单元模型的语法语义分析结果,其中,程序组织单元模型的定义包括:功能、功能块以及程序的定义。

进一步地,根据变量模型的语法语义分析结果进行程序组织单元模型的语法语义分析,生成程序组织单元模型的语法语义分析结果,包括:

对所述软件模型的语法语义分析结果进行划分处理,得到至少2种语言的分析结果;

对所述至少2种语言的分析结果分别进行程序组织单元模型的语法语义分析;其中,所述至少2种语言包括下述至少2种:梯形图语言、顺序功能流程图语言、功能区块图语言、指令表语言、结构化文本语言及basic语言。

第二方面,本申请实施例还提供多语言代码编译器,包括词法分析器、语法语义分析器及目标代码生成器;

词法分析器,用于根据预设词法分析规则对源程序代码进行词法分析处理,生成词法分析结果,其中,源程序代码包括多种不同语言的源程序代码;

语法语义分析器,用于根据预设语法语义分析规则对所述词法分析结果进行语法语义分析,生成语法语义分析结果;

目标代码生成器,用于根据预设目标代码的生成规则对所述语法语义分析结果进行目标代码的分析,生成目标代码。

进一步地,源程序代码包括下述至少2种源程序代码,梯形图语言、顺序功能流程图语言、功能区块图语言、指令表语言、结构化文本语言及basic语言的编译。

进一步地,词法分析器,具体用于将源程序代码编译所需的头文件代码添加至源程序代码,得到新的源程序代码;根据预设词法分析规则对新的源程序代码进行进行词法分析处理并生成词法分析结果;其中,预设词法分析规则包括下述一种或多种组合:分界符类别、运算符类别、标识符类别、注释类别、常量类别或关键字类别规则。

进一步地,语法语义分析器,具体用于采用变量模型对源程序代码的词法分析结果进行语法语义分析,生成变量模型的语法语义分析结果,其中,变量模型包括:单个变量和变量段的定义,变量段的定义包括输入变量段、输出变量段、局部变量段及全局变量段的定义;采用软件模型对变量模型的语法语义分析结果进行软件模型的语法语义分析,生成软件模型的语法语义分析结果,其中,软件模型的定义包括:软件配置、软件资源及软件任务的定义;采用程序组织单元模型对软件模型的语法语义分析结果进行程序组织单元模型的语法语义分析,生成程序组织单元模型的语法语义分析结果,其中,程序组织单元模型的定义包括:功能、功能块以及程序的定义。

进一步地,语法语义分析器,具体用于对软件模型的语法语义分析结果进行划分处理,得到至少2种语言的分析结果;对至少2种语言的分析结果分别进行程序组织单元模型的语法语义分析;其中,至少2种语言包括下述至少2种:梯形图语言、顺序功能流程图语言、功能区块图语言、指令表语言、结构化文本语言及basic语言。

本申请的有益效果是:

本申请实施例提供的多语言代码编译方法及编译器中,基于iec61131-3标准,使用该编译方法可以对多种不同语言的源程序代码进行编译,将“源语言无关”部分进行整合,使得多语言编译器的结构得到很大简化,提升代码效率和减少代码的维护,并且在iec61131-3编程语言的基础上增加了basic语言编译的支持。

附图说明

为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本申请实施例提供的iec61131-3编程标准的层次结构示意图;

图2为本申请实施例提供的多语言编译方法的流程示意图;

图3为本申请实施例提供的多语言编译器的架构示意图一;

图4为本申请实施例提供的多语言编译器的架构示意图二。

图标:201-词法分析器;202-语法语义分析器;203-目标代码生成器;204-变量模型分析器;205-软件模型分析器;206-程序组织单元模型分析器;207-中间代码生成器;208-环境监测分析器;209-错误管理器。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。

因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。

本申请首先对iec61131-3标准进行介绍,iec11131-3编程标准主要包括两个部分:公共元素和编程语言。这两个部分在语言的不同层面对标准控制工程语言进行了规范,其层次结构如图1所示。公共语言元素是标准的通用模块,在任何编辑语言中都有相同的定义结构;编程语言部分是对控制工程编程语言的具体定义,涉及具体语言的语法语义结构。

其次,本申请对现有的支持iec61131-3标准的多语言编译器进行介绍,如上文所述,iec61131-3标准说明了5种编程语言,其中,包括梯形图(ld)、顺序功能流程图(sfc)及功能区块图(fbd)三种图形化语言;还包括指令表(il)和结构化文本(st)两种文本化语言。具体地,ld语言、sfc语言及fbd语言,在逻辑控制方面较容易;il语言和st语言,易于实现一些复杂的算法。

本申请实施例提供一种多语言代码编译方法,如图3所示,所述方法包括:

s101.根据预设词法分析规则对源程序代码进行词法分析处理,生成词法分析结果,其中,源程序代码包括多种不同语言的源程序代码。

其中,预设词法分析规则可以为预先自定义的词法规则,将源程序代码首先依据该词法规则进行分析处理,特别地,对于多种不同语言的源程序代码,将使用统一的预设词法分析规则进行词法分析预处理。

s102.根据预设语法语义分析规则对词法分析结果进行语法语义分析,生成语法语义分析结果。

其中,在生成语法语义分析结果中,首先将依据词法分析结果是否为源语言功能函数的实现部分,将源程序代码划分为“源语言相关”部分和“源语言无关”部分。此处所说的“源语言相关”部分即源语言功能函数的实现部分;“源语言无关”部分即源语言程序中一些变量的定义等,例如:源程序代码中变量模型和软件模型部分的定义。

源程序代码在进行词法分析预处理后生成词法分析结果,词法分析结果在进行语法语义分预处理后将进一步生成语法语义分析结果。

特别地,对于多种不同语言的源程序代码,“源语言相关”部分,对于不同语言的词法分析结果将使用不同的预设语法语义分析规则分别进行处理,以生成相应的语法语义分析结果;“源语言无关”部分,对于不同语言的词法分析结果将使用统一的预设语法语义分析规则进行处理,以生成语法语义分析结果。

s103.根据预设目标代码的生成规则对语法语义分析结果进行目标代码的分析,生成目标代码。

其中,在语法语义分析结果生成目标代码的过程中,需要引入中间代码,中间代码是一种面向语法,易于翻译成目标程序的源程序的等效内部表示代码,其可理解性及易于生成目标代码的程度介于源语言和目标语言之间。因此,得到的语法语义分析结果首先依据预设中间代码的生成规则,生成中间代码结果;中间代码结果再依据目标代码的生成规则生成目标代码。

特别地,对于多种不同语言的源程序代码,将使用统一的预设中间代码的生成规则,生成中间代码结果;中间代码结果将使用统一的预设目标代码的生成规则进行目标代码的生成。

具体地,本申请所提供的多语言代码编译方法的编译步骤如下:

首先,通过统一的预设词法分析规则对多种不同语言的源程序进行词法分析,生成词法分析结果。其次,在进行语法语义分析结果的生成过程中,依据输入的待处理程序代码是否为源语言功能函数的实现部分,将源程序代码划分为“源语言相关”部分和“源语言无关”部分。其中,对于“源语言相关”部分,不同的语言使用不同的预设语法语义分析规则分别进行处理,以生成相应的语法语义分析结果;对于“源语言无关”部分,均使用统一的预设语法语义分析规则进行处理,生成语法语义分析结果;最后,根据预设目标代码的生成规则对语法语义分析结果进行目标代码的分析,生成目标代码,完成多语言代码的编译。

综上所述,本申请所提供的多语言代码编译方法,该编译方法基于iec61131-3标准,不仅可以支持iec61131-3标准规定语言的编译,同时支持basic语言的编译,使用该编译方法可以对多种不同语言的源程序代码进行编译,通过将“源语言无关”部分进行整合,使得多语言编译器的结构得到很大简化,提升代码效率和减少代码的维护。

进一步地,源程序代码包括下述至少2种源程序代码:

源程序代码包括ld语言、sfc语言、fbd语言、il语言和st语言及basic语言。

本申请支持多语言的源程序代码的编译,源程序代码包括多种不同语言的源程序代码,具体地,ld语言、sfc语言及fbd语言是图形化语言;il语言和st语言是文本化语言。而basic语言,由于其语法结构类似于st语言,且比st语言指令更加丰富,具有与st相似的属性,因此,本申请也将支持basic语言的编译。

进一步地,根据预设词法分析规则对源程序代码进行词法分析处理,生成词法分析结果,包括:将源程序代码编译所需的头文件代码添加至源程序代码,得到新的源程序代码;根据预设词法分析规则对新的源程序代码进行词法分析处理并生成词法分析结果;其中,预设词法分析规则包括下述一种或多种组合:分界符类别、运算符类别、标识符类别、注释类别、常量类别或关键字类别规则。

头文件作为用户源程序代码和函数库之间的桥梁和纽带,编译时,编译器通过头文件找到对应的函数库,进而把已引用函数的实际内容导出来代替原有函数,使用统一的定义函数可以简化源程序代码的编译过程,提高代码的重用性。

预设词法分析规则包括下述一种或多种组合:分界符类别、运算符类别、标识符类别、注释类别、常量类别或关键字类别规则,包括但不仅限于此。具体地,在预设词法规则中,例如:分界符和注释只是起到分隔单词、辅助编辑的作用,没有实际意义,识别之后不需要做额外操作;常量识别后,要返回常量类型和常量值;标示符识别后,需要判断是不是关键字。

进一步地,根据预设语法语义分析规则对词法分析结果进行语法语义分析,生成语法语义分析结果,包括:采用变量模型对源程序代码的词法分析结果进行语法语义分析,生成变量模型的语法语义分析结果,其中,所述变量模型包括:单个变量和变量段的定义,变量段的定义包括输入变量段、输出变量段、局部变量段及全局变量段的定义。

其中,变量定义模型包括两个部分,单个变量定义和变量段定义。每个变量段中可以定义若干个变量。

采用软件模型对所述变量模型的语法语义分析结果进行软件模型的语法语义分析,生成软件模型的语法语义分析结果,其中,软件模型的定义包括:软件配置、软件资源及软件任务的定义。

采用程序组织单元(programorganizationunit,pou)模型对软件模型的语法语义分析结果进行程序组织单元模型的语法语义分析,生成程序组织单元模型的语法语义分析结果,其中,程序组织单元模型的定义包括:功能、功能块以及程序的定义。

pou是用户算法实现的具体定义区域,pou彼此之间能够带或不带有参数地相互调用,是用户程序中最小的、独立的软件单元。

进一步地,根据软件模型的语法语义分析结果进行程序组织单元模型的语法语义分析,生成程序组织单元模型的语法语义分析结果,包括:对软件模型的语法语义分析结果进行划分处理,得到至少2种语言的分析结果;对至少2种语言的分析结果分别进行程序组织单元模型的语法语义分析;其中,至少2种语言包括下述至少2种:ld语言、sfc语言、fbd语言、il语言、st语言及basic语言。

此外,还需要说明的是,本申请还可以根据预设的运行环境规则和预设的错误管理规则,监测词法分析结果的生成过程、语法语义分析结果的生成过程及目标代码的生成过程的运行环境以及错误状态。

另外,如图3所示,本申请另一实施例还提供了一种多语言代码编译器,包括:词法分析器201、语法语义分析器202及目标代码生成器203;

词法分析器201,用于根据预设词法分析规则对源程序代码进行词法分析处理,生成词法分析结果,其中,源程序代码包括多种不同语言的源程序代码。

语法语义分析器202,用于根据预设语法语义分析规则对词法分析结果进行语法语义分析,生成语法语义分析结果。

目标代码生成器203,用于根据预设目标代码的生成规则对所述语法语义分析结果进行目标代码的分析,生成目标代码。

进一步地,所述源程序代码包括下述至少2种源程序代码:ld语言、sfc语言、fbd语言、il语言、st语言及basic语言的编译。

进一步地,词法分析器201,具体用于将源程序代码编译所需的头文件代码添加至源程序代码,得到新的源程序代码;根据预设词法分析规则对新的源程序代码进行进行词法分析处理并生成词法分析结果;其中,预设词法分析规则包括下述一种或多种组合:分界符类别、运算符类别、标识符类别、注释类别、常量类别或关键字类别规则。

具体地,本申请词法分析器201,可以为词法生成器(lexicalcompiler,lex),lex生成词法分析器其源文件具有三部分结构:定义段、规则段和支持程序段,每个部分之间用顶行的两个连续的百分号“%%”分割开。其中,支持程序有三个:关键字判断程序,获取关键字类型程序,注册标识符程序,本申请将支持程序段的该部分程序简要列出:

iskeyword()

{/*查找关键字表,判断是否为关键字*/

//keytextfirst:关键字的第一个字符;keytextleng:关键字长度};

getkeywordtype(){//获取关键字类型};

registerkey(){//把关键字装入符号表};

进一步地,语法语义分析器202,具体用于采用变量模型对源程序代码的所述词法分析结果进行语法语义分析,生成变量模型的语法语义分析结果,其中,变量模型包括:单个变量和变量段的定义,变量段的定义包括输入变量段、输出变量段、局部变量段及全局变量段的定义;采用软件模型对变量模型的语法语义分析结果进行软件模型的语法语义分析,生成软件模型的语法语义分析结果,其中,软件模型的定义包括:软件配置、软件资源及软件任务的定义;采用程序组织单元模型对软件模型的语法语义分析结果进行程序组织单元模型的语法语义分析,生成程序组织单元模型的语法语义分析结果,其中,所述程序组织单元模型的定义包括:功能、功能块以及程序的定义。

本申请中,语法语义分析器202为编译器代码生成器(yetanothercompilercompiler,yacc)时,该yacc语法语义分析器源文件具有三部分结构:定义段、规则段和支持程序段,每个部分之间用顶行的两个连续的百分号“%%”分割开。语法语义分析器202为yacc语法语义分析器时,将包括三个语法语义分析器202,如图4所示,分别是:变量模型分析器204、软件模型分析器205及程序组织单元模型分析器206。需要说明的是,每个模型的语法语义分析器202都具有其相应的定义段、规则段和支持程序段,下文本申请将对该三类模型的语法语义分析器202进行分别介绍。

变量模型分析器204,用于采用变量模型对源程序代码的所述词法分析结果进行语法语义分析,生成变量模型的语法语义分析结果,其中,所述变量模型包括:单个变量和变量段的定义,变量段的定义包括输入变量段、输出变量段、局部变量段及全局变量段的定义;

即变量模型分析器204包括两个部分,单个变量定义和变量段定义。每个变量段中可以定义若干个变量。单一变量的两种规约规则和动作定义如下所示:

%%

vardefine:varnamevartype;

{installvar(varname.exp,vartype.exp);}

vardefine:varnamevartype:=immediate;

{installvar(varname.exp,vartype.exp,immediate.val);}

%%

规约变量定义后,语法分析程序调用相应文法定义式后的动作代码。

varinseg:var_input{setcurrsegvarin();}

vardefine*

end_var{closecurrvarseg();}

以上语句是输入变量段规约规则和动作定义,括号中的c语言程序用于完成当前代码段设置、当前代码段关闭的功能。其他输出变量段、局部变量段、全局变量段的规约规则和动作定义与输入变量类似。

软件模型分析器205,用于采用软件模型对所述变量模型的语法语义分析结果进行软件模型的语法语义分析,生成软件模型的语法语义分析结果,其中,所述软件模型的定义包括:软件配置、软件资源及软件任务的定义。

yacc的规则段描述语法语义的规约规则和规约动作。以配置为例,词法分析器201读取到“configration”后,查找文法定义,确定使用configuration的定义式;“configration”约之后紧接一个标识符,定义配置的名称。语法分析器读入程序后,执行后面的动作:注册configname的配置模块;其后继续执行,识别出配置声明信息,执行setconfigattribute()设置配置属性动作;当读取到“end_configration”时,文法定义式执行完毕,语法分析程序进行configuration规约。

程序组织单元模型分析器206,用于采用程序组织单元模型对软件模型的语法语义分析结果进行程序组织单元模型的语法语义分析,生成程序组织单元模型的语法语义分析结果,其中,程序组织单元模型的定义包括:功能、功能块以及程序的定义。

进一步地,语法语义分析器202,具体用于对软件模型的语法语义分析结果进行划分处理,得到至少2种语言的分析结果;对所述至少2种语言的分析结果分别进行程序组织单元模型的语法语义分析;其中,所述至少2种语言包括下述至少2种:梯形图语言、顺序功能流程图语言、功能区块图语言、指令表语言、结构化文本语言及basic语言。

将语法语义分析器202首先对软件模型的语法语义分析结果进行“源语言相关”部分和“源语言无关”部分的划分。其中,对于“源语言相关”部分和“源语言无关”部分的定义,请参考上文所述,此处不再赘述。语法语义分析器202对至少2种语言的软件模型的语法语义分析结果进行划分,此处以il语言和basic语言为例,进行介绍。具体地,在程序组织单元模型中“程序”的定义部分,对于程序的poubody部分需要根据具体的语言调用不同的分析工具。

语法语义分析器202首先对il语言和basic语言的软件模型的语法语义分析结果,划分成il语言的“源语言相关”部分;basic语言的“源语言相关”部分;与il语言和basic语言均无关的“源语言无关”部分。

对于il语言的“源语言相关”部分,采用il语言的特定程序组织单元模型分析器206进行其对应程序组织单元模型的语法语义分析;最后依次通过中间代码生成器207,目标代码生成器203生成目标代码。

对于basic语言的“源语言相关”部分,采用basic语言的特定程序组织单元模型分析器206进行其对应的程序组织单元模型的语法语义分析;最后依次通过中间代码生成器207,目标代码生成器203生成目标代码。

而对于与il语言和basic语言均无关的“源语言无关”部分,将直接依次通过中间代码生成器207,目标代码生成器203生成目标代码。

进一步地,还包括运行时环境监测分析器208和错误管理器209,其中运行时环境监测分析器208用于根据预设的运行环境规则实时监测lex生成词法分析器、yacc语法语义分析器及目标代码生成器203等的运行环境;而错误管理器209则用于实时监测、统计lex生成词法分析器、yacc语法语义分析器及目标代码生成器203等的错误和警告。

本申请另一实施例提供一种程序产品,例如计算机可读存储介质,其上存储有计算机程序,该程序在被处理器执行时用于执行上述方法实施例。具体实现方式和技术效果类似,这里不再赘述。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1