基于BNF范式的M3中Schema板架语言的解析
by eattonton
摘要:M3系统中提供了一套完整的板架参数化建模系统,基于这套系统为设计员提供了建立船体结构的基础。随着M3在我国造船工业中的广泛应用,理解M3这套参数化系统的建模系统变得很有必要。参数化建模中除了提供了界面输入参数外,还提供了Schema语句的方式。这篇文章将对Schema(Sch)语句进行语义的解析。
关键字: M3, Schema, BNF
1. 前言
M3凭借其强大的参数化建模系统,能够为设计员在船体建模方面提供无与伦比的灵活性及规范性,使其能够建模市面上所有的船型。也正是基于此,M3广泛应用于船舶工业。M3参数化建模提供了一种Sch的描述语言,通过Sch语句能够编辑模型。相比,界面输入创建模型相比。通过Sch语言创建模型具有如下优势:
优势1.语言编辑模型具有更强的灵活性,各种参数可以灵活的组合,以满足设计的需要。
优势2.对于同一种结构,可以有多种语义的表达方式。这就为建模实现方式提供了灵活性。
优势3.基于语义的参数化建模,可扩展性好。可以通过二次开发的形式,批量快速的生成和编辑语句,同时修改模型。
Sch语句是用户在文本中输入的,是以文本的形式提供给计算机端的。需要把这些文本解析(Parser)成计算语言,计算机程序才能运行这些语句。这边文件将介绍,利用BNF范式构建Sch语言的计算机结构,并通过解析程序转换成我们需要的计算机代码。
2. BNF范式
BNF是“Backus Naur Form”的缩写。John Backus和Peter Naur首次引入一种形式化符号来描述给定语言的语法。BNF出现的很早,早期用在对计算机语言的描述,后来随着技术的发展。BNF也用于对语言的解析,是一种语言的语言。限于篇幅,这篇文章就不展开了。这里列举一些BNF范式的规则:
::= 表示 定义为
| 表示 或者
< > 表示类别名字
需要用到的就这么点,但是这足够了。在这篇文章展开之前,先举一个加法的及其简单的例子。
2.1 例子
“1+2”是一个很简单的加法公式,当我们以文本的形式给计算机处理时,需要考虑如何把这个公式翻译成计算机能懂的语言。在高级语言中都有EVAL函数,直接把文本公式转换成执行程序。但是,如果没有这些高级功能,如何去实现这个功能呢。这就需要用到计算机的编译开发。
针对这个加法公式,并利用编译原理。我们的思路是这样的,首先进行词法分析,分析得到所包含的数字以及符号,再转换成计算机语言,对该公式进行运算,获得我们想要的结果。
词法分析是第一步,也是最重要的一步。可以利用的工具有BNF范式,正则表达式等。但是正则表达式无法表达递归等复杂的语言表达。而BNF在这方面确实优势。加法公式的BNF的表述如下:
!公式
|
有了BNF范式,下一步就是找一个解析器。可以利用的解析器也是比较多的,如Yecc, GoldParser等。通过BNF和解析器组合,这段文字就能被计算机执行了。
BNF主要还是作为编译开发的一部分,编译开发又是很底层,很深奥的开发。就需要掌握更多的知识,这篇文章显然无法达到那样的高度。只能利用现有的工具,作为工程上面的应用。
3. Schema语句
板架建模需要用的Schema语句,语句是格式如下:
NOT, R50, COR=1;
其中NOT为类型字段(Statement keyword)
R50为贯穿孔的规格字段
COR=1 表示贯穿孔的位置,它由Keyword和value通过等号表示。
Schema语句表达模型的方式灵活,在实际建模使用中也是使用极为频繁。Schema语句的BNF范式表达如下:
|
|
((,|/) {
上面只是一个通用的表达,对于具体的某种类型的语句,需要具体的限定,这样才能把语句文本,解析成我们想要的计算机程序执行对象。
Schema语句的具体使用和参考,可以看M3帮助文档(Document),HullàPlanar ModellingàDesign Language of Tribon Hull Modelling
4. 语句解析例子
有了前面的分析基础,下面我们来做一个具体的Sch语句分析。由于整个Sch语句体系,还是比较复杂,需要投入一定的精力来完成这个操作。这里我们列举了Notch孔的语句解析过程。
4.1 分析Notch孔的种类
M3系统中板架上面的Notch孔按照定位的不同分为以下三种:沿着边界布置(along a limit),沿着焊缝布置(for seam),沿着角点布置(at Corner)
4.2 构建BNF范式
根据帮助文档,根据这三种类型构建Sch语言的BNF范式描述。
第一,定义notch的规格,下面我们列举了了其中几种,如R50
|'RW'
|'KEH'
|'KEH'
|'KEH'
|'KUH'
第二,定义沿着边界布置
,U|V|X|Y|Z=
[,ALONG]
第三,沿着焊缝布置
,SEAM=
第四,沿着角点布置
[,LIM=
第五,Notch语句
|'NOT,'
|'NOT,'
其中
4.3 创建Notch的类
这里的类是面向对象语言的概念,这里我们使用c#语言。就是一种面向对象的语言。为了使解析出来的内容能够被计算机程序运行,就必须建立一个Notch类对象,把解析出来的对象运行在我们的程序中。
4.4 使用解析器Parser
上面也提到过解析器,解析器就是能够根据BNF定义的语义,对Sch语句进行解析,并把解析结果实例化一个类的对象。我们这里选择了一个开源的Parser程序。这样大大的提高了我们开发的效率,也为工程的实际应用提高了可靠性。
通过上面的几步,实现了我们的目标,能够把Notch语句,转换成一个Notch类对象。这个对象就能够很方便的在我们的计算机程序中使用。
5. 小结
这篇文章虽然没有贴出程序截图和程序的源码,但是基本描述了sch解析的程序实现思路。个人觉得编写程序,前期的准备很重要。把程序的思路先理清楚,需要使用的工具都弄明白。后续的代码编写就会方便很多。而且程序出来的功能也会更加的满足我们需求。
Sch语言实际是一种小众的脚本语言,但是,我们看到了这种语言的强大之处。在M3中还有很多使用这种脚本语言,来实现功能的地方。这些脚本语言的使用大大的提高了M3的应用范围。这也是M3广泛的被全球的造船企业接受的原因。这篇文章使用BNF范式为基础,利用Parser解析器技术,对脚本语言进行解析。为后续充分使用好M3软件提供了基础,也为国内想开发高水准的行业解决方案软件,提供了一点点编程方面的小技巧。