APP下载

S1000D Process数据模块解析引擎的设计与实现

2014-03-06黄燕冰

航空标准化与质量 2014年6期
关键词:堆栈阅读器引擎

黄燕冰

S1000D Process数据模块解析引擎的设计与实现

黄燕冰

[中图分类号]

ASD S1000D《基于公共源数据库的技术出版物国际规范》是目前使用最为流行的交互式电子技术资料手册标准,它采用了结构化的方式把航空保障业务数据定义为各种不同的数据模块,Process数据模块是其中交互阅读表达能力最强的数据模块,其交互要求远远超过其它数据模块。

在Process数据模块的内容中定义了诸多流程控制元素,如变量、循环、条件、开关、跳转、赋值、表达式等控制逻辑要素,使得它的导航阅读过程就如同计算机指令解析过程,因此该数据模块的解析必须建立一个类似于虚拟机器执行器的导航解析引擎。

Process数据模块的导航解析引擎应允许与用户进行交互,要求导航引擎能支持用户更深入地参与其中,用户应可改变变量的值、跳转到指定元素、单步执行、回撤操作等导航行为。

1 IETM阅读器

交互式电子技术手册阅读器,简称为IETM阅读器,是电子技术信息手册的阅读平台,也是武器装备技术信息化保障平台的重要组成部分。IETM阅读器的主要任务是提取、显示技术信息、并提供与用户交互的功能。

基于S1000D的IETM阅读器具备有S1000D标准中所有类型数据模块的阅读能力,Process数据模块阅读器只是IETM阅读器的其中的一个重要组成部分,而Process数据模块解析引擎是Process数据模块阅读器的核心模块。

由此可知,Process数据模块解析引擎是IETM阅读器的一个专用于Process数据模块阅读的程序模块。

2 Process数据模块解析引擎

在介绍Process数据模块导航引擎之前,首先对Process数据模块的主要构成内容进行详细说明。2.1 数据模块内容逻辑模型

S1000D Process数据模块的Schema结构相当复杂,包含许多元素和属性,但是从整体结构上来看,它包含的主要节点有:variableDeclarations、dmSeq、dmIf、dmLoop,其中dmSeq、dmIf、dmLoop是可以互为上下级的。

● variableDeclarations节点

该节点是一个变量定义表,可包含多个变量,变量之间通过变量名称区分,变量取值类型有:boolean、string、real、integer、set-string、setreal、set-integer7种数据类型。

● dmSeq节点

该节点包含dmNode、dmNodeAlt、dmIf、dmLoop 4种节点,其中dmNode是在导航过程中每一步需要显示的内容,dmNodeAlt是多选一的开关,它可包含多个dmNode,并且每次导航只选取一个dmNode,类似于C语言中的Switch语句。

● dmIf节点

该节点包含了expression、dmThenSeq、dmElseSeq 3种节点,其中expression为表达式节点,描述条件判断节点的表达式条件,通过它决定判断条件的真与假。dmThenSeq、dmElseSeq是它的分支节点。

● dmLoop节点

该节点包含variablePreSet、expression、dmSeq、assertion 4个节点,其中variablePreSet为循环体的预设内容,主要是在进入循环之前进行变量值的设置;expression为循环体条件,判断循环体是继续执行还是跳出循环;dmSeq则是循环体内容,每次循环中都需要执行该节点内容;assertion是循环体每次执行后的设置,通常用于改变变量的值。

2.2 解析引擎

本文中把Process数据模块解析引擎构成要素划分为如下内容:指令读取器、指令集、导航器、指令执行。

它们之间的关系可由图1说明。

图1 解析引擎框架图

2.2.1 指令读取器

在本文中引入指令读取器,其主要目的是读取Process数据模块的内容并且转换成导航器所需的指令。

● 数据模块内容模型

指令读取器需要把Process数据模块内容读取到内存中,并通过分析Process数据模块内容把内容转换成树状结构的模型。

依据Process数据模块Schema内容,可把内容转换成如图2逻辑模型。

图2 Procss数据模块逻辑模型

● 指令读取

用户通过与导航引擎交互,驱动导航器开始工作,而导航器通过指令读取器获取下一条指令,并压入孩子堆栈中以等待执行。

2.2.2 指令集

基于导航过程的抽象行为,可以把指令分为以下几类:可停靠指令、可显示指令、可压栈指令、可运行指令。一个具体的指令可以属于多个指令类型。

在本文的设计中,使用接口类区分不同类型的指令,使用IDockable接口表示可停靠指令、IPushable表示可压栈指令、IDisplayable表示可显示指令、IRunnable表示可运行指令。这几种指令类型的关系,可由图3说明。

● 可停靠指令

可停靠指令是指导航器导航到该对象时需要暂停,等待外部事件,接受到外部事件后才能进一步执行,如同汇编中的中断指令。

在Process数据模块的阅读过程中,导航引擎接受到用户的阅读请求(例如阅读下一步内容、上一步内容等)后,一般来说阅读器不会一直执行至结束,而是在这个过程会停顿下来,把解析后的内容呈现给用户,并且等待接受用户的下一个交互请求。

图3 指令类型类图

这个停顿过程的控制,在解析引擎的设计中采用了一种特定的指令类型,本文称为可停靠指令。

● 可显示指令

可显示指令的执行需要在阅读器中显示阅读内容。

可显示指令又分为主动显示和被动显示指令,主动显示指令不仅本身内容需要显示,并且它的孩子也需要参与后续导航;而被动显示指令只有本身显示要求,其孩子不需要参与后续导航。

● 可压栈指令

可压栈指令指对应节点的孩子需要参与到后续导航过程中,导航器在导航到它时需要将它压入孩子堆栈以等待导航器后续的解析。

可压栈指令是非常重要的指令类型,区分了指令对应的数据模块内容节点的孩子内容是否需要参与到导航过程中,简单的说就是导航器是否需要分析节点的孩子信息,只需通过该节点对应的指令是否是可压栈的即可。

● 可运行指令

可运行指令指对应节点可被作为导航过程的入口点单独运行,等同于计算机应用程序的主函数。

导航器的运行内容的范围是被运行节点以及它的后代。如果在运行节点的后代中存在引用节点,那么它的运行内容也是可以被扩大的。

Process数据模块中,XML节点的对应指令归类如图4所示。

图4 Process数据模块节点指令归类

2.2.3 导航器

导航器在Process数据模块解析引擎中充当了逻辑解析器的角色,对指令内容进行逻辑运算和解析,是最为核心的组成部分。

在本节中分别从导航器的存储结构、导航器与用户的交互接口、导航器执行逻辑三个角度探讨导航器设计方法。

2.2.3.1 存储结构

由于Process数据模块的逻辑过程是树形结构而非线性结构,需要两个堆栈记录导航内容,第一个堆栈一般用于记录父亲节点,第二个堆栈用于记录孩子节点,第一个堆栈为父亲堆栈,第二个堆栈为孩子堆栈;同时由于导航过程是可回溯的因此引入另外两个堆栈,分别记录父亲堆栈、孩子堆栈的变化内容,命名为父亲变化堆栈、孩子变化堆栈。

另外在导航的过程中需要记录当前的执行状态,即当前状态堆栈的记录内容;还需要使用导航上下文记录导航器导航过程的一些状态和导航相关服务。

● 父亲堆栈

父亲堆栈用于记录当前执行点的父亲节点,该父亲节点同时也是一个返回点,如同计算机程序中的方法调用中的返回地址。当该父亲节点的所有孩子节点执行完成后,该节点需要从父亲堆栈中移除。

● 孩子堆栈

孩子堆栈也称为执行堆栈,需要参与后续导航的指令先是压入孩子堆栈,再等待导航器执行。

导航器下一个执行的指令总是从孩子堆栈的栈顶获取,如果孩子堆栈的内容为空则说明全部内容已经导航结束。

● 孩子变化堆栈

孩子变化堆栈用于记录孩子堆栈的变化,在导航回退时使用,可以还原孩子堆栈内容。

● 父亲变化堆栈

父亲变化堆栈用于记录父亲堆栈的变化,在导航回退的使用,可以还原父亲堆栈内容。

● 当前状态栈

该堆栈用于记录导航过程中的导航器的状态变化信息,包含有变量的值改变信息、停靠节点、导航范围节点、以及当前导航过程中条件的运算结果等。

上面的存储结构组装在一起统称为导航器的会话状态。

2.2.3.2 导航器与用户的交互接口

导航器接口目前有执行、跳转、下一步、上一步、返回等。

● 执行

导航器开始执行,在执行过程中导航器选择开始对象(可运行指令),并且初始化导航器信息,执行开始对象直至达到可停靠对象。

● 跳转

导航器执行过程中,用户通过交互活动改变默认导航过程,使导航开始节点更改。从上面可以看出,跳转过程是有用户参与的,不是导航器的默认导航行为。

● 下一步

导航器推进一步,从当前停靠对象导航至下一个停靠对象。

● 上一步

返回到上一次停靠状态,在这个过程中需要根据父亲变化堆栈、孩子变化堆栈恢复父亲堆栈和孩子堆栈的内容,同时也需要回滚变量表、当前堆栈、导航上下文等内容。

● 返回

返回指恢复到上一个开始导航对象,一般发生过跳转后才能进行返回,导航器恢复到导跳转前的状态。

2.2.3.3 导航器执行逻辑

本文中挑选导航器中比较典型的算法进行解析说明,分别为“下一步”、“上一步”执行逻辑,其它的导航与“下一步”的导航逻辑大同小异。

2.2.3.3.1 下一步执行逻辑

导航器的执行过程以“下一步”最为典型,概要阐述该算法过程:

1)保存上一步历史,包括当前的导航状态、变量值,保存父亲堆栈和孩子堆栈的状态;

2)循环执行,直至停止标识StopFlag=True,读取孩子堆栈的栈顶元素,记为TopElement;

3)判断TopElement是否为空;

a)如果为空,则循环地把父亲堆栈的栈顶元素出栈,直至父亲堆栈为空或者碰到循环指令;如果碰到循环指令,则判断循环是否结束,如果为结束则把循环的孩子元素依次压入孩子堆栈中,同时执行循环的第二个断言集合;如果父亲堆栈为空,装入5;

b)如果不为空,则转入4;

4)执行TopElement;

a)判断TopElement是否为循环指令,如果是则执行前置条件判断;如果结论为假,则转入2;

b)判断栈顶元素是否为可停靠指令,是则设置StopFlag=true;执行下面步骤:

i.获取栈顶元素的有效孩子指令(条件判断节点获取有效分支);

ii.把所有可压栈的孩子指令压入堆栈中;iii.转入2;

5)保存堆栈和变量变化;

a)比较父亲堆栈和孩子堆栈的变化,并把变化内容保存到变化堆栈中;

b)比较变量值,把有变化的变量值记录下来;

6)结束下一步导航。

2.2.3.3.2 上一步执行逻辑

1)还原上一次的历史状态;

a)还原变量值;

b)还原孩子堆栈、父亲堆栈、当前状态堆栈;

c)还原孩子变化堆栈、父亲变化堆栈;

2)执行“下一步”逻辑;

3)结束“上一步”导航。

2.2.4 指令执行

不同指令有着不同的执行逻辑,即使相同指令类型的执行逻辑也是有差异的。在这里指令的执行不同于计算机机器的指令,是一个原子操作,它的粒度更粗些,是一个组合指令,可以由多个指令组成。

指令的执行可分为条件计算、断言赋值(变量赋值)、指令过滤、内容显示。

● 条件计算

条件计算出现在IfNode、LoopNode、AlterNode节点类型的指令,用于计算该类指令中的条件。

● 断言赋值

断言赋值出现在PresetNode、PostsetNode、LoopNode3种类型的节点中,用于对变量进行赋值操作。

● 指令过滤

指令过滤用于在导航过程中导航器根据某些条件筛选参与后续导航节点,这类指令的执行会产生需要参与后续导航的指令。

● 内容显示

该指令的执行一般会在Process数据模块的阅读器中展示其对于节点的内容,而不同的可显示指令显示的内容和显示的方式有着非常大的差异,因此在本文的设计中引入一种可扩展内容执行器。

3 Process数据模块解析引擎的应用

在IETM阅读器中打开技术资料手册,系统进入具体手册阅读状态,原型如图5所示。的图标分别为“运行”、“上一步”、“下一步”、“返回”等操作。

在原型图中的手册目录下,点击Process数据模块,系统加载Process数据模块阅读器,进入Process

● Process数据模块被加载后,系统启用Process数据模块解析引擎,解析引擎把Process数据模块的内容加载到内存中,并把它转换成树状结构的Process数据模块逻辑模型。

● Process数据模块正式开始导航,系统默认以根节点为运行节点,开始运行,解析引擎启用指令读取器读取数据模块指令。

● 解析引擎启动导航器,并且以“下一步”方式驱动导航器运行,导航器执行“下一步”逻辑直至暂停。

● 系统暂停后,解析引擎统一执行显示指令,把内容显示到IETM阅读器中。

系统暂停后,用户通过上述四个功能按钮,可以进一步与解析引擎进行交换,进行“下一步”、“上一步”、“返回”、“运行”等操作。

4 结束语

本文从应用需求的角度出发,提出了一种解决S1000DProcess数据模块的解析难题的方法,借鉴堆栈机器的构造方法,创新性地使用多个堆栈解决具有树状数据结构数据的Process数据模块的阅读问题,为Process数据模块阅读器提供的实现基础。

导航解析引擎虽然很好地解决Process数据模块的阅读需求,在设计上也比较简洁和统一,但是本设计中没有把条件运算、断言判断作为指令对待,而是对其进行特殊处理,作为If、Loop指令的附加内容有些不妥;另一问题是区分主动显示和被动显示指令应该可以避免的;希望后续的研究中能对其进行改进,使整个解析引擎的解析逻辑更清晰、简单。

[1] ASD S1000D International Specification for Technical Publications Utilizing a Common Source Database [S].V4.0,2009.05

(编辑:劳边)

[收修订稿日期] 2014-09-22

[文章编号][编码]

猜你喜欢

堆栈阅读器引擎
基于行为监测的嵌入式操作系统堆栈溢出测试*
新海珠,新引擎,新活力!
The Magna Carta
车坛往事4:引擎进化之屡次失败的蒸汽机车
Winner Takes All
蓝谷: “涉蓝”新引擎
基于图论的射频识别阅读器防碰撞算法
基于堆栈自编码降维的武器装备体系效能预测
一种基于中间件的RFID阅读器去冗余高效算法
一种航天器软件进程堆栈使用深度的动态检测方法