基于BNF范式的M3中Schema板架语言的解析

来源:互联网 发布:js实现百分比水平条 编辑:程序博客网 时间:2024/06/05 18:36

基于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的表述如下:

<number>  ::= [0123456789]*

!公式

<expression>  ::= <expression> '+' <number>

                   | <number>

<number> 表示整数

<expression>表示加法公式 而且是递归的,也就是说 1+2+3这样的算法也是支持的。

有了BNF范式,下一步就是找一个解析器。可以利用的解析器也是比较多的,如Yecc, GoldParser等。通过BNF和解析器组合,这段文字就能被计算机执行了。

BNF主要还是作为编译开发的一部分,编译开发又是很底层,很深奥的开发。就需要掌握更多的知识,这篇文章显然无法达到那样的高度。只能利用现有的工具,作为工程上面的应用。

3.      Schema语句

板架建模需要用的Schema语句,语句是格式如下:

              NOT, R50,  COR=1;

其中NOT为类型字段(Statement keyword)

       R50为贯穿孔的规格字段

       COR=1 表示贯穿孔的位置,它由Keyword和value通过等号表示。

Schema语句表达模型的方式灵活,在实际建模使用中也是使用极为频繁。Schema语句的BNF范式表达如下:

<value> ::=  <number>

 | <string>

| <name_string>

<stmt_value> ::= <value>

<statement> ::= <stmt_keyword>[,<stmt_value>] <clause>

          ((,|/) {<reference> }  )  (...)

上面只是一个通用的表达,对于具体的某种类型的语句,需要具体的限定,这样才能把语句文本,解析成我们想要的计算机程序执行对象。

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

         <notch_des>::= 'R'<double>

            |'RW'<double>

            |'KEH'<double>'*'<double>

            |'KEH'<double>'*'<double>'*'<double>

            |'KEH'<double>'*'<double>'*'<double>'*'<double>

            |'KUH'<double>'*'<double>

第二,定义沿着边界布置

<notch_along_limit> ::=  ,LIM=<limit_no>

      ,U|V|X|Y|Z= <coord>

 [,ALONG]

       第三,沿着焊缝布置

<notch_for_seam>::= [,<adj_name>]

     ,SEAM= <seam_no>, (1 ... 25) [,REF]

       第四,沿着角点布置

       <notch_at_corner>::=, COR=<corner_no>  (1 ... 25)

                       [,LIM=<limit_no>  (1 ... 25)]

       第五,Notch语句

       <notch> ::='NOT,'<notch_des>’,’<notch_at_corner>

         |'NOT,'<notch_des>’,’<notch_along_limit>

         |'NOT,'<notch_des>’,’<notch_for_seam>

其中 <corner_no>::=<limit_no>::= <integer> 为整形数据结构

4.3    创建Notch的类

这里的类是面向对象语言的概念,这里我们使用c#语言。就是一种面向对象的语言。为了使解析出来的内容能够被计算机程序运行,就必须建立一个Notch类对象,把解析出来的对象运行在我们的程序中。

4.4    使用解析器Parser

上面也提到过解析器,解析器就是能够根据BNF定义的语义,对Sch语句进行解析,并把解析结果实例化一个类的对象。我们这里选择了一个开源的Parser程序。这样大大的提高了我们开发的效率,也为工程的实际应用提高了可靠性。

通过上面的几步,实现了我们的目标,能够把Notch语句,转换成一个Notch类对象。这个对象就能够很方便的在我们的计算机程序中使用。

5.      小结

这篇文章虽然没有贴出程序截图和程序的源码,但是基本描述了sch解析的程序实现思路。个人觉得编写程序,前期的准备很重要。把程序的思路先理清楚,需要使用的工具都弄明白。后续的代码编写就会方便很多。而且程序出来的功能也会更加的满足我们需求。

Sch语言实际是一种小众的脚本语言,但是,我们看到了这种语言的强大之处。在M3中还有很多使用这种脚本语言,来实现功能的地方。这些脚本语言的使用大大的提高了M3的应用范围。这也是M3广泛的被全球的造船企业接受的原因。这篇文章使用BNF范式为基础,利用Parser解析器技术,对脚本语言进行解析。为后续充分使用好M3软件提供了基础,也为国内想开发高水准的行业解决方案软件,提供了一点点编程方面的小技巧。

 

0 0
原创粉丝点击