0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于三叉树链表的编译器中间结构的设计方案研究

牵手一起梦 来源:电子元器件应用 作者:马圣 2020-05-14 09:13 次阅读

引言

IEC61131—3组态软件是分布式控制系统中的上位软件,是工程师与系统的接口,可完成控制系统中现场设备运行的逻辑组态,从而实现对系统的控制。随着PLCDCS系统的应用日趋广泛,IEC6113l一3已经在工业自动化中建立了牢固的国际标准,国内外大部分工业自动化厂商都有提供基于国际标准IEC6113l一3的IEC组态编程系统,IEC组态软件的研发已经成为工业自动化厂商的核心技术。IEC组态软件的实现原理之一是将前端用各种组态语言(ST,LD,FBD,SFC,IL)编写的程序转化成中间结构,再由组态软件编译后端根据不同的硬件平台信息将中间结构编译成在该平台上可执行的目标文件。组态软件编译部分的中间结构是组态软件IEC语言前端与组态软件编译后端的主要接口。好的中间结构可使IEC语言前端做到与目标机器无关,而不依赖于目标机器平台,同时可节省IEC语言前端的翻译工作。现今编译程序使用的中间结构有很多种形式,常见的有逆波兰式、三元式、四元式和树形结构,本文介绍一种基于三叉树链表的中间结构。

1 、总体设计思想

基于树形结构的中间结构是现今大多数编译器中间结构的主流设计方案,比如GCC、LCC、TCC等均使用二叉树或者多又树作为其中间结构。本文介绍的是一种三叉树的设计方案。该方案中,以中间结构表示的高级语言程序单元就是三叉语法树节点组成的多层森林,每一层森林都是一个一维双向链表,链表中的每个“节点”称之为语法树(一棵三叉树),而每棵语法树的节点则称之为树节点。其中,程序单元以POU(程序组织单元)为翻译单位。

每个三叉树节点包括的信息主要有语法树的操作、节点类型、指向三个子树的指针、链表前项与后项指针、关联符号指针等。树节点结构体的数据结构表示如下:

基于三叉树链表的编译器中间结构的设计方案研究

其中,语法操作表示该节点可以完成什么样的“运算”。语法分析树的语法操作符可以分为分别是POU节点操作符、语句操作符和表达式操作符三种类型,这三种类型的语法操作符将在下一节详细介绍,通常可以语法分析树的语法操作来区分不同的语法分析树。

类型是指当前语法分析树所代表的语法操作的类型。

符号指针是指向该节点关联的符号表项,并非所有节点的此项都有内容,具体那些节点中可以关联符号也将在下一节介绍。

图1所示是一个POU程序单元以三叉树链表的中间结构总体表示的总体形式。

采用三叉树森林的方法能够充分的表示正常的高级语言,同时,与其他编译器不同,该方法还引入了POU节点操作符和语句操作符,而省去了前端大量语法翻译的工作,符合IEC工业语言编译器多前端的特征。

2、 中间结构说明

语法分析树的语法操作符可分为POU节点操作符、语句操作符和表达式操作符三种类型。下面来详细介绍这三种语法树节点的各种属性。

2.1 POU节点操作符

POU节点操作符可用于表示POU的开始、结束、作用域和变量定义。各节点属性如表l所列。

其中,语法操作以宏定义的形式声明。符号是该节点关联的符号表项。符号可分为POU符号和变量符号。POU符号包括POU名、参数个数及类型、返回值类型、POU地址等信息;变量符号则包括变量名、类型、作用域和地址等信息。

表l中的唯一节点指整个森林第一层链表中的节点;叶节点指链表中一棵三叉树的叶节点。

2.2 语句操作符

语句操作符分为分支选择操作符、循环操作符、跳出、返回、调用和无条件跳转等。各节点属性如表2所列。

表2中的根节点指森林中一棵三叉树的根节点;中间节点指某三叉树中的中间节点,它既非根节点,也非叶节点。CH00SE的左子节点是条件判定,中子节点是条件为真的内容,右子节点是条件为假的内容。同样,LOOP的左子节点是条件判定,中子节点是循环体,右子节点是循环计数。对于WHILE语句,右子节点可以为空。RETURN的左子节点是返回表达式子树。CALL的左子节点是参数子树,中子节点是调用子树。

2.3 表达式操作符

表达式操作符包括所有的高级语言运算符,如赋值、算术、关系、逻辑运算符等,以赋值、取地址和加法运算符为例,其表达式操作符号主要属性如表3所列。

3 、ST语言代码对应的中间结构表示

本节以一段ST的POU程序为例,将其转化为中间结构,以证明中间结构的可行性。假设此POU中所定义的整型变量为a,b,那么,其POU程序如下:

对应的中间结构如图2所示。其中,EQUAL是等值运算符的宏定义。

4、结束语

本文介绍了一种三叉树的中间结构设计方案。该方案充分考虑了IEC61131—3组态软件的多前端特性,并能够做到不依赖于后端,同时为各语言翻译前端的设计提供了很大的便利。这种中间结构设计在HCC(Hollysys C Compiler)编译器的开发中已经实现,其可行性也得到了验证,并已应用在实际的组态软件开发项目中。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • plc
    plc
    +关注

    关注

    4972

    文章

    12217

    浏览量

    454664
  • 组态软件
    +关注

    关注

    4

    文章

    223

    浏览量

    26704
  • 编译器
    +关注

    关注

    1

    文章

    1570

    浏览量

    48599
收藏 人收藏

    评论

    相关推荐

    【Ti SimpleLink SensorTag申请】基于蓝牙的智能三叉神经疼痛理疗仪

    申请理由:智能三叉神经疼痛理疗仪是一款专业应用于缓解慢性疼痛的智能设备。现目前使用BLE4.0做蓝牙从机,使设备与手机进行数据交互使用,并通过手机和服务进行数据收集及分析。之前有用过蓝牙2.0进行
    发表于 03-29 15:30

    交叉编译器解析

    的应用程序。:使用交叉编译器的原因ARM上可以运行操作系统,所以用户完全可以将ARM当做计算机来使用,理论上也可以在ARM上使用本地的编译器编译程序.但是,
    发表于 12-16 09:47

    交叉编译器解析

    的应用程序。:使用交叉编译器的原因ARM上可以运行操作系统,所以用户完全可以将ARM当做计算机来使用,理论上也可以在ARM上使用本地的编译器编译程序.但是,
    发表于 12-21 16:57

    求问 PRU 是什么编译器,OMAPL138中,CCS6.1【红】。请看截图。

    只初步了解 OMAPL138 带有 ARM9 CPU和 C6748 DSP 两个核。求问 PRU 是什么编译器,OMAPL138中,CCS6.1【红】。请看截图。求问 如何消除 这个【红】,在安装 CCS6.1 的 哪个 步
    发表于 02-18 14:33

    查找(GIF动图讲解)

    ,则右子树上所有结点的值均大于它的根结点的值;·任意节点的左、右子树也分别为二查找;·没有键值相等的节点。二查找相比于其他数据结构
    发表于 07-29 15:24

    收藏 | 程序员面试,你必须知道的8大数据结构

    面试题会明确提及某种数据结构,例如,“给定一个二叉树。”而另一些则隐含在面试题中,例如,“我们希望记录每个作者相关的书籍数量。”即便是对于一些非常基础的工作来说,学习数据结构也是必须的。那么,就让
    发表于 09-30 09:35

    自制Voron三叉戟裙灯

    描述Voron三叉戟裙灯PCB
    发表于 09-01 06:58

    基于CoSy的编译器开发的研究

    CoSy是ACE公司开发的编译器构造框架[1]。它提供共享工具和引擎来构造编译器编译器开发者只专注于目标机相关代码的开发。CoSy框架生成的编译器具有可扩展性和可移植性。可以根据目
    发表于 08-19 17:49 0次下载
    基于CoSy的<b class='flag-5'>编译器</b>开发的<b class='flag-5'>研究</b>

    编译器是如何工作的_编译器的工作过程详解

    随着计算机的发展,编译器已经发挥着十分重要的作用。本文主要介绍了编译器的种类、编译器的工作原理以及编译器工作的具体操作过程及步骤详解。
    发表于 12-19 12:54 1.5w次阅读

    C到VHDL的编译器设计与实现详解

    本文主要介绍了C到VHDL的编译器设计与实现,首先介绍了C与VHDL的语言特征,其次阐述了设计方案,最后介绍了转换过程及测试分析,具体的跟随小编一起来了解一下。
    发表于 05-17 11:06 4194次阅读

    既然C编译器是C语言写,那么第一个C编译器是怎样来的?

    既然C编译器是C语言写的,那第一个C编译器是怎样来的?
    的头像 发表于 02-25 15:47 2794次阅读

    王垠谈编译器

    由于早期的 Lisp 编译器生成的代码效率普遍低下,成为了 Lisp 失败的主要原因之一。而现在的高性能 Lisp 编译器(比
    的头像 发表于 03-30 10:45 1860次阅读

    Keil编译器--结构体指针函数;结构体作为参数时,不能调用结构体指针函数

    Keil编译器很多奇葩的地方,比如很多程序的写法在keil编译器里面实现是实现不了的,并且不报错,而且莫名其妙的死机。结构体里面有函数指针时,直接调用是可以的,但是在当结构体作为参数传
    发表于 12-20 19:41 19次下载
    Keil<b class='flag-5'>编译器</b>--<b class='flag-5'>结构</b>体指针函数;<b class='flag-5'>结构</b>体作为参数时,不能调用<b class='flag-5'>结构</b>体指针函数

    交叉编译器安装教程

    交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。Ubuntu 自带的 gcc 编译器是针对 X86 架构的,而我们现在要编译的是 ARM
    的头像 发表于 09-29 09:12 2620次阅读

    LeetCode876链表中间结点介绍

    给定一个头结点为 head 的非空单链表,返回链表中间结点。
    的头像 发表于 01-11 17:58 636次阅读
    LeetCode876<b class='flag-5'>链表</b>的<b class='flag-5'>中间</b>结点介绍