首页> 中国专利> 面向三维对象控制的脚本语言系统与控制方法

面向三维对象控制的脚本语言系统与控制方法

摘要

面向三维对象控制的脚本语言系统及控制方法,该系统及方法在诸如节目排练、文化创意过程中提供一种有效辅助决策支持。该系统由6个部分组成:语法定义支持模块、词法分析模块、语法语义分析模块、语义解释模块以及绘制引擎模块。该方法通过对语法解析、对脚本词法分析、语法语义分析、语义解释以及三维表现6个过程实现。使该系统具有开发周期短、可维护性好、以及易修改性强的优点,此外,用户通过使用该脚本语言编写控制脚本便可达到控制三维对象的目的,为非专业用户使用虚拟现实应用系统提供了一种灵活并较全面的人机交互接口。

著录项

  • 公开/公告号CN101482822A

    专利类型发明专利

  • 公开/公告日2009-07-15

    原文格式PDF

  • 申请/专利权人 北京航空航天大学;

    申请/专利号CN200910077229.4

  • 申请日2009-01-20

  • 分类号G06F9/44(20060101);G06T15/70(20060101);

  • 代理机构11251 北京科迪生专利代理有限责任公司;

  • 代理人成金玉;卢纪

  • 地址 100083 北京市海淀区学院路37号

  • 入库时间 2023-12-17 22:14:42

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-03-09

    未缴年费专利权终止 IPC(主分类):G06F9/44 授权公告日:20120321 终止日期:20150120 申请日:20090120

    专利权的终止

  • 2012-03-21

    授权

    授权

  • 2009-12-30

    实质审查的生效

    实质审查的生效

  • 2009-07-15

    公开

    公开

说明书

技术领域

本发明涉及一种面向三维对象控制的脚本语言系统与控制方法,属于虚拟现实技术领域。

背景技术

根据对象控制侧重点不同,目前三维对象控制方法主要分为两类:面向对象属性设置的控制方法和面向对象动作设置的控制方法。

目前通用的游戏引擎多采用面向对象属性设置的控制方法。首先通过配置文件设定场景中的对象属性,然后用户通过游戏界面控制对象运动过程。使用这种控制方式往往只能配置对象的静态参数。

提供面向动作控制的控制方法最出名的系统当算是Virtools。Virtools通过给每一个模型提供动作能力并对动作能力参数设定控制模型运动过程。但是普通用户很难熟练使用该方法实现对三维对象的控制,因为熟练使用Virtools之后才能掌握该种控制方法。

目前控制方法实现分为两类:一类是通过用户使用界面(GUI)实现(例如3DMAX)。使用该技术控制对象较为直接但开发过程较为复杂,开发周期一般较长(大约一般需要至少一年的时间)。另外一类通过配置文件实现(目前很多三维场景演示系统都采用此方法),由于这种实现技术通过配置文件中的多种关键字标识各参数,使得编辑该配置文件较为复杂,同时,该技术不是通过语义检查参数错误,报错机制较为简单,很难检查出配置文件中的语义错误,使得在配置文件较大的情况下很难查错改错,使得用户输入错误率提高。

发明内容

本发明的技术解决问题:克服现有技术的不足,提供一种面向三维对象控制的脚本语言系统与控制方法,用户不必专门培训便能够通过编写脚本控制三维对象,为非专业人士使用虚拟现实系统提供了一种灵活的人机交互接口,缩短了开发周期;减少了用户输入错误,提高了系统的可维护性和易修改性。

本发明的技术解决方案:面向三维对象控制的脚本语言系统,如图1所示包括:

语法定义文件:定义脚本语言语法规则,该语法规则覆盖对象参数设置、运动过程控制、漫游控制和场景设置,该语法规则存储在语法定义文件中;

语法定义支持模块:对语法定义文件进行解析,分离出终结符、非终结符和关键字,并对语法定义文件中的标识符进行识别,所述的语法定义文件由语法规则和关键字组成,语法规则由终结符和非终结符组成,同时基于终结符、非终结符、关键字和识别出的语法定义文件中的标识符,把语法定义文件中的语法规则通过索引的形式映射到语法规则表,解析完成后分别形成终结符号表、非终结符号表、关键字表以及语法规则表,然后基于终结符号表和非终结符号表以及语法规则表再计算出每一个终结符、非终结符的first集以及非终结符的follow集,最后基于每个非终结符的first集和follow集以及语法规则表映射形成预测分析表,再将终结符、非终结符及每个非终结符的first集和follow集、关键字、语法规则表和预测分析表存放在解析结果文件中,供词法分析模块、语法分析模块和语义分析模块调用;

词法分析模块:对用户按照语法定义文件中的脚本语言语法规则编写的脚本进行词法分析,通过调用解析结果文件检查脚本中的每一个单词是否符合语法定义规则,确定每个单词的属性,即是哪一种关键字,关键字分为NUM、IDENTIFIER和STRING三种,并以单词串的形式输出至语法分析模块;

语法语义分析模块:根据解析结果文件中的预测分析表,对词法分析模块输出的单词串进行语法分析,检查单词串中语句是否符合语法规则表中的语法规则,每分析完单词串的一个语句,判断该语句是否符合语法定义文件中的语法规则,如果不符合该语句的构成,该语句的构成包括终结符、非终结符和关键字,则报告脚本中存在错误,语法分析终止,如果符合便得到该语句的构成,则对该语句的构成进行语义分析,判断该语句的构成为终结符、非终结符和关键字中哪一种符号,并进行相应的存储;当所有的单词串中的所有语句进行语义分析完后,所有语句的构成形成语义分析树,各语句存放在语法分析树的节点中;

语义解释模块:遍历语法语义分析模块形成的语义分析树,完成对该语义分析树中各节点中存放的语句的解释,将解释后的语句内容作为参数放置在事件等待链表中等待绘制引擎模块触发执行;

绘制引擎模块:提供整个系统的运行框架,在用户请求时,加载词法分析模块、语法语义分析模块、语义解释模块对脚本进行词法分析、语法语义分析和语义解释;同时在该框架下检查事件等待链表中是否有达到该语句所描述事件的触发时刻,如果有,则解释执行该语句然后继续按照运行框架运行,如果没有,则继续按照运行框架运行。

所述的语法语义分析模块实现过程如下:

(1)初始化堆栈,把语法分析完成的结束标识符,记为‘#’和语法定义文件中的开始符号依次压入堆栈;

(2)从词法分析模块输出的单词串中依次读取单词符号,记为a,把当前堆栈顶符号,记为X;

(3)如果X=a≠‘#’,则查找语法规则表中关于当前堆栈顶符号X的语法规则,判断该语法规则中单词符号a是否需要存储,如果需要存储,说明是单词串中一个语句的构成,该语句的构成包括终结符、非终结符和关键字,把a的地址存放在参数表中,参数表记为paramTable,再把X从堆栈中弹出,则转到步骤(2)继续;如果不需要存储,则再把X从堆栈中弹出后转到步骤(2)继续;

(4)如果X是一个非终结符,则要查看预测分析表,将预测分析表记为M,从预测分析表M中查找对应的M[X,a]表项,如果该表项存有语法规则,则首先把X从栈顶弹出,然后把该语法规则中的符号按照反序一一进堆栈,语法规则中的符号进堆栈之前要判该符号是否需要存储,如果需要存储,则在paramTable中分配空间用于存储该符号,转到步骤(2)继续,如果不需要存储,则转到步骤(2)继续;如果M[X,a]表项对应为空值,则报告脚本中存在错误,语法分析终止;

(5)如果堆栈顶符号X是语法定义文件中标识符中的ACTION符号,则说明一条语句已经分析完成,要对当前语句进行语义分析,首先根据该语句的构成需要的空间大小分析出该存储该语句所需要的空间大小,该语句的构成所需要的空间取决该语句的构成为终结符、非终结符和关键字中哪一种符号,然后根据该语句占用空间大小进行空间分配,最后根据paramTable把该语句存放在该空间内,语义分析完成后,该语句的值已经作为语义分析树的节点求得,判断当前语句是否需要存储,如果需要存储,则把所述的语义分析树的节点地址放入paramTable中,继续执行步骤(2);如果不需要存储,则继续执行步骤(2),当所有的单词串中的所有语句进行语义分析完后,所有语句的构成形成语义分析树;

(6)如果X=a=‘#’,则说明语法语义分析完毕,至此语义分析树的所有节点均已求出,即构成形成语义分析树,此时paramTable表中最后一个参数即为该语义分析树的根节点,记为ROOT,把ROOT进行存储。

所述的绘制引擎模块实现过程如下:

(1)进行三维场景初始化,加载需要的模型;

(2)对需要绘制的下一帧进行如下过程:

(2.1)检查是否有用户请求;

(2.2)如果有则判断是何种请求;

a.如果是脚本执行请求,则进行加载词法分析模块、语法语义分析模块、语义解释模块对脚本进行词法分析、语法语义分析和语义解释;

b.如果是除了脚本执行请求外的其他请求,则进行相对应的处理;

(2.3)检查事件等待链表中是否有达到该语句所描述事件的触发时刻,如果有,则执行该语句,然后继续执行步骤(3),如果没有,则继续执行步骤(3),直至有需要触发的语句;

(3)绘制当前帧,以三维的形式表现出来;

(4)转到步骤(2)继续,直到用户请求退出。

4、面向三维对象控制的脚本语言控制方法实现步骤如下:

(1)定义脚本语言语法规则;

(2)对所定义的脚本语言语法规则进行解析,分离出终结符、非终结符和关键字,并对语法定义文件中的标识符进行识别,所述的脚本语言语法规则由终结符、非终结符和关键字组成,对非终结符再计算出每个非终结符的first集和follow集,然后基于终结符、非终结符、关键字和识别出的语法定义文件中的标识符,把语法定义文件中的语法规则通过索引的形式映射形成语法规则表,基于每个非终结符的first集和follow集建立预测分析表,再将终结符、非终结符及每个非终结符的first集和follow集、关键字、语法规则表和预测分析表存放在解析结果文件中,供词法分析、语法分析和语义分析使用;

(3)对用户按照语法定义文件中的脚本语言语法规则编写的脚本进行词法分析,通过调用解析结果文件检查脚本中的每一个单词是否符合语法定义规则,确定每个单词的属性,即是关键字或终结符,并以单词串的形式输出;

(4)根据解析结果文件中的预测分析表,对词法分析输出的单词串进行语法分析,检查单词串中语句是否符合语法规则表中的语法规则,每分析完单词串的一个语句,判断该语句是否符合语法定义文件中的语法规则,如果不符合该语句的构成,该语句的构成包括终结符、非终结符和关键字,则报告脚本中存在错误,语法分析终止,如果符合便得到该语句的构成,则对该语句的构成进行语义分析,判断该语句的构成为终结符、非终结符和关键字中哪一种符号,并进行相应的存储;当所有的单词串中的所有语句进行语义分析完后,所有语句的构成形成语义分析树;

(5)遍历语义分析树,完成对该语义分析树中所有语句的解释,将解释后的语句内容作为参数放置在事件等待链表中等待触发执行;

(6)在用户请求时,对脚本进行词法分析、语法语义分析和语义解释;不断检查事件等待链表中是否有达到该语句所描述事件的触发时刻,如果有,则采用虚拟现实技术以三维的形式表现出来,如果没有,则继续检查等待,直至有需要触发的语句。

本发明与现有技术相比的优点在于:

(1)由于该系统脚本语言接近自然语言,因此用户不必专门培训便能够通过编写脚本控制三维对象,为非专业人士使用虚拟现实系统提供了一种灵活的人机交互接口。

(2)由于该系统通过用户编写脚本实现三维对象控制,不必再开发繁琐的用户操作界面,缩短了开发周期。

(3)由于该系统对用户编写的脚本提供语法语义层次级的错误检查机制,一方面把错误检查层次提高了,减少了用户输入错误;另外一方面把错误收敛至绘制引擎模块,提高了系统的可维护性和易修改性。

附图说明

图1为本发明系统的体系结构图;

图2为本发明系统中的语法定义支持模块实现过程;

图3为本发明系统中的词法分析模块实现过程;

图4为本发明系统中的语法语义分析模块实现过程;

图5为本发明系统中的语义解释模块实现过程;

图6为本发明的绘制引擎模块实现过程。

具体实施方式

为了更好地理解本发明,先对一些基本概念进行一下解释说明。

语法规则:由终结符、非终结符组成,形如P:=…a…A…c…B….(其中大写字母代表终结符、小写字母代表非终结符),每一个语法规则定义了一个语句的构成,用来检查一个语句是否正确。语法规则相当于汉语中的“句型”,一条语法规则对应一种句型,可以用语法规则检查脚本中的语句的过程等同于用判断一句话是否符合某一句型的过程。例如,假设有语法规则,记为A,有脚本中的语句,记为s,有句型:“陈述句”,句子:“他是男人”,则判断s是否满足A的过程等同与判断“他是男人”这句话是否满足“陈述句”这个句型的过程。

语法:由语法规则组成,是语法规则集合的统称。

开始符号:是一个特殊的非终结符号,在该发明中,把语法定义文件中的第一条语法规则中出现的第一个非终结符作为开始符号。

终结符:指组成语言的基本符号,用户编写的脚本中的任意单词符号都是终结符。

非终结符:是一定符号串的集合,该符号串又由终结符和非中介符组成。代表了一个语法范畴,例如“算术表达式”是一个非终结符号。

关键字:关键字是一种终结符,该系统用关键字区别脚本中的每一个终结符的种类。

标识符:该符号存在于语法定义文件中,供语法定义支持模块对语法进行解析时使用,主要包括:‘@’,‘ACTION’,‘:=’等。

语法规则表:是语法定义文件中的语法规则的索引形式,该索引的建立基于每一条语法规则中的终结符或非终结符在终结符列表和非终结符列表中的位置。

预测分析表:该表是一个二维表,供语法分析时使用。该表的行由终结符列表中的所有终结符组成,该表的列由非终结符列表中的所有非终结符组成。每一个表项要么存放一个语法规则要么为空。

语义分析树:本发明中的面向三维对象控制的脚本语言系统对脚本语法语义分析完成后,会生成一棵树,该树中的每一个节点存放脚本中的一个语句,因为该树与语法分析树拓扑结构相同,因此将其称之为语义分析树。

下面结合附图对本发明进行详细说明

如图1所示,本发明面向三维对象控制的脚本语言系统包括语法定义文件、语法定义支持模块、词法分析模块、语法语义分析模块、语义解释模块和绘制引擎模块。

整个实现过程如下:

(1)定义脚本语言语法规则,该语法规则覆盖场景设置、漫游控制、对象参数设置以及运动过程控制四方面,该语法规则存储在语法定义文件中;

(2)对语法定义文件中存有的脚本语言语法规则进行解析,分离出终结符、非终结符和关键字,并对语法定义文件中的标识符进行识别,所述的脚本语言语法规则由终结符、非终结符和关键字组成,对非终结符再计算出每个非终结符的first集和follow集,然后基于终结符、非终结符、关键字和识别出的语法定义文件中的标识符,把语法定义文件中的语法规则通过索引的形式映射形成语法规则表,基于每个非终结符的first集和follow集建立预测分析表,再将终结符、非终结符及每个非终结符的first集和follow集、关键字、语法规则表和预测分析表存放在解析结果文件中,供词法分析模块、语法分析模块和语义分析模块调用;

(3)对用户(使用该系统控制三维对象的最终用户)按照语法定义文件中的脚本语言语法规则编写的脚本进行词法分析,通过调用解析结果文件检查脚本中的每一个单词是否符合语法定义规则,确定每个单词的属性,即是关键字或终结符,并以单词串的形式输出至语法分析模块;

(4)根据解析结果文件中的预测分析表,对词法分析模块输出的单词串进行语法分析,检查单词串中语句是否符合语法规则表中的语法规则,每分析完单词串的一个语句,判断该语句是否符合语法定义文件中的语法规则,如果不符合该语句的构成,该语句的构成包括终结符、非终结符和关键字,则报告脚本中存在错误,语法分析终止,如果符合便得到该语句的构成,则对该语句的构成进行语义分析,判断该语句的构成为终结符、非终结符和关键字中哪一种符号,并进行相应的存储;当所有的单词串中的所有语句进行语义分析完后,所有语句的构成形成语义分析树;

(5)遍历语法语义分析模块形成的语义分析树,完成对该语义分析树中所有语句的解释,将解释后的语句内容作为参数放置在事件等待链表中等待绘制引擎模块触发执行;

(6)绘制引擎模块提供整个系统的运行框架,在用户请求时,加载词法分析模块、语法语义分析模块、语义解释模块对脚本进行词法分析、语法语义分析和语义解释;同时在该框架下检查事件等待链表中是否有达到该语句所描述事件的触发时刻,如果有,则采用虚拟现实技术以三维的形式表现出来,如果没有,则继续按照运行框架运行。

上述各部分的具体实现过程如下:

1.语法定义文件,定义脚本语言语法规则,该语法规则覆盖对象参数设置、运动过程控制、漫游控制和场景设置,该语法规则存储在语法定义文件中;

语法规则如下:

基本概念部分

/*A*/"translation_seq":="translation"@a"translation_seq_addon"@b;@ACTION(a,b)  (1)

/*A*/"translation":="node"@a;@ACTION(a)                                           (2)

第(1)条语法规则意为:一个脚本由一个需要翻译的部分(translation)加上其余部分(translation_seq_addon)构成,而这个translation可以是一个对象节点(node)。

/*A*/"translation_seq_addon":="translation_seq"@a;@ACTION(a)                     (3)

/*B*/"translation_seq_addon":=NIL;                                                 (4)

第(3)条语法规则意为:其余部分(translation_seq_addon)可以还是一个需要翻译的序列(translation_seq)。而第(4)条语法规则意为:其余部分(translation_seq_addon)也可能为空。然后给出一个对象节点的语法规则:

/*A*/"node":=Node"string"@a{"nodeaction_seq"@b};@ACTION(a,b)                 (5)

/*A*/"nodeaction_seq":="nodeaction"@a"nodeaction_seq_addon"@b;@ACTION(a,b)    (6)

/*A*/"nodeaction_seq_addon":="nodeaction_seq"@a;@ACTION(a)                       (7)/B/nodeaction_seq_addon":=NIL;                                                                   (8)

第(5)条规则定义了一个节点的组成。

第(6)条规则意为:对象的动作序列是一个动作(nodeaction)加上另外一个动作序列(nodeaction_seq_addon),而第(7、8)条语法规则定义另外一个动作序列(nodeaction_seq_addon)可能是一个动作序列或者是一个空值。

对象参数设置部分

/*A*/"nodeaction":=Timer="time"@a;@ACTION(a)                        (9)

含义是:设置当前对象运动开始时间。

/*B*/"nodeaction":=Show="show_method"@a;@ACTION(a)            (10)

含义是:设置当前对象是否显示。

/*C*/"nodeaction":=Position="position_method3d"@a;@ACTION(a)  (11)含义是:设置这个当前物体在场景中的位置。是一个绝对位置,一般用在该对象的初始设置。

运动过程控制部分

/*D*/"nodeaction":=Span3D=from"point3"@a to"point3"@b direction"point3"@c in"signednum"@d

seconds CID"signednum"@e;@ACTION(a,b,c,d,e)                              (12)含义是:使当前对象在一定的时间内,从一定移动平移到另外一点。并把该动作加上相应的控制id号。

/*E*/"nodeaction":=Rotate=axis"point3"@a angle"signednum"@bin"signednum"@c seconds CID"signednum"@d;@ACTION(a,b,c,d)                                               (13)

含义是:把当前对象沿着某一个轴在一定的时间间隔内以均与角速度旋转一定的角度。/*F*/"nodeaction":=Span3DRelative=to"point3"@a direction"point3"@b in"signednum"@c seconds CID"signednum"@d;@ACTION(a,b,c,d)                                               (14)

含义是:使该对象从当前位置沿着某一个方向以均匀速度平移到另外一点,并把该动作加上相应的控制id号。

/*G*/"nodeaction":=CIDRemove="signednum"@a;@ACTION(a)          (15)

含义是:把当前对象的动作id把该动作清除掉。一般用在对象的复位操作过程中。

/*H*/"nodeaction":=Transform=CID"signednum"@a OutofRange"signednum"@b Control"signednum"@c FromTime"signednum"@d scale"signednum"@e;@ACTION(a,b,c,d,e)  (16)

对于该语法规则:CID表示当前动作id号;OutofRange指名当前动作执行之后进行的动作:可以是重复执行,也可以是执行到当前位置停止等等,它后面跟的参数是一个枚举型参数;Control后面也跟随一个枚举性参数,确定动作帧是顺序绘制还是逆序绘制。动作帧的逆向绘制实际上就是物体运动的逆运动,例如假设物体初始运动是从东向西的运动,则逆向运动则是从西向东的运动过程;FromTime确定了从当前动作帧序列中哪一个时刻(转换成对应动作帧)开始播放;scale则控制了动作帧的绘制方式(跳跃绘制或者插入中间帧绘制),间接反映对象的运动速度。因此这个语法规则实际上就是通过设置个对象对应的动作帧序列相关参数间接控制该对象动作过程。

漫游控制部分

/*B*/"translation":="camera"@a:@ACTION(a)                               (17)

下面是对carmera这个非终结符的语法解释:

/*A*/"camera":=Camera"string"@a{"cameraaction_seq"@b};@ACTION(a,b)   (18)

/*A*/"cameraaction_seq":="cameraaction"@a"cameraaction_seq_addon"@b;@ACTION(a,b)                                                                                 (19)

/*A*/"cameraaction_seq_addon":="cameraaction_seq"@a;@ACTION(a)          (20)

/*B*/"cameraaction_seq_addon":=NIL;                         (21)

/*A*/"cameraaction":="time"@a;@ACTION(a)                  (22)

/*B*/"cameraaction":=Resource"num"@a@ACTION(a);           (23)

/*C*/"cameraaction":=SetPosViewUp("position_method3d"@a,"position_method3d"@b,"position_method3d"@c);@ACTION(a,b,c)                                               (24)

/*D*/"cameraaction":=CameraOffset from"point3"@a to"point3"@b in"num"@c secondsstay"num"@d;@ACTION(a,b,c,d)                                                 (25)

/*E*/"cameraaction":=CameraCircleAround"string"@a radius"num"@b height"num"@c from"point3"@d in"num"@e seconds;@ACTION(a,b,c,d,e)                            (26)

/*F*/"cameraaction":=CameraFocusOn"string"@a from"point3"@b length"num"@c to"point3"@d length"num"@e motion"num"@f band"num"@g in"num"@h seconds;@ACTION(a,b,c,d,e,g,h)       (27)

以上语法规则包括设定使用哪一个相机进行漫游(场景中可以有多个相机,分别朝向不同角度,也可有定义好轨迹的动态相机,动态相机可以按照预定轨迹自动漫游);设置当前相机朝向;设置当前相机环绕方式;设置相机动作序列。

场景设置部分

虚拟现实系统中场景设置是必不可缺的,该脚本语言能够很好的支持场景设置,包括天空盒设置;环境光设置;背景音乐设置;是否采用LOD;场景对象调度方式等。语法规则如下:

/*A*/"translation":="scene"@a:@ACTION(a)                                                         (28)

/*A*/"scene":=Scene"string"@a{"scenceasetting_seq"@b};@ACTION(a,b)                            (29)

/*A*/"scenceasetting_seq":="scensetting"@a"scenceasetting_seq_addon"@b;@ACTION(a,b)            (30)

/*A*/"scenceasetting_seq_addon":="scenceasetting_seq"@a;@ACTION(a)                                (31)

/*B*/"scenceasetting_seq_addon":=NIL;                                                               (32)

/*A*/"scenceasetting":="time"@a;@ACTION(a)                                                        (33)

/*B*/"scenceasetting":=SkyBox"num"@a;@ACTION(a)                                                   (34)

/*C*/"scenceasetting":=Light"num"@a;@ACTION(a)                                                   (35)

2.语法定义支持模块

该模块的实现过程如图2所示:

(1)从存放语法定义的文件中读取一行。

(2)如果没有读取成功说明分析完毕,执行步骤(8)

(3)以空格作为分隔符号,解析出该行中的所有单词和标识符。

(4)把该行中的单词分为终结符、非终结符、关键字存放在相应表中。区分依据如下:

a.如果当前单词的前一个单词是“keyword”,则该单词是一个关键字,存放在关键字列表中,同时存放在终结符号表中。

b.如果当前单词的用双引号引起来的,则认为是一个非终结符,如果该非终结符号在非终结符号表中找不到则放入非终结符号表中,否则继续对下一个单词判断。如果当前单词不是用双引号引起来的,则判断该词能否在关键字列表中找到,如果能则继续对下一个单词处理,如果不能则报错。

(5)根据该行中第一个单词是否为“/*字母*/”(如/*A*/)的形式,判断该行是否为一个语法规则,如果是“/*字母*/”的形式,则是一个语法规,继续执行下一步,否则执行步骤(2)

(6)基于语法规则中的终结符、非终结符、关键字和标识符通过索引的形式把该语法规则映射到语法规则表。实现过程如下:

(6.1)分配一个整数数组,记为A,用来存放映射后的语法规则。

(6.2)从该行中取出一个符号,根据当前符号的类型进行如下判断。

(6.3)如果是一个单词时,记为a,得到a在终结符号表中的序号,把该序号放入A中。如果是一个标识符,则执行步骤(6.4)。

(6.4)如果该标识符是‘@’符号且前面符号是一个单词,记为b,此时b的序号,记为i,已经存入A,则对i加上存储标志,表明b需要存储。

否则执行步骤(6.5)。

(6.5)如果该标识符是‘ACTION’,则把该符号存入数组A,继续执行步骤(6.2)。否则,也继续执行步骤(6.2)。

(6.6)此时已经完成了对该行中所有符号的处理,则把数组A的内容逆序存放在语法规则表中,作为其中的一条记录。完成了该对“语法定义文件”中该行对应的语法规则索引映射到语法规则表的过程。

(7)基于终结符表和非终结符表,计算根据规则列表中存放的语法规则,计算所有终结符和非终结符的first集以及非终结符的follow集。

(7.1)通过以下步骤计算符号A的first集:

a.如果A是一个终结符则first(A)={A};

b.如果A是一个非终结符,则看语法规则表中是否存在关于A的语法规则A:=B..,且B为非终结符号,则把B的first集加入A中。

(7.2)通过以下步骤计算非终结符,记为A,A的follow集:

a.如果A是语法的开始符号,把语法分析的结束标志加入到A的follow集中。

b.查看语法规则表,如果有语法规则A:=aBb,则把符号b的first集加入到A的follow集中。

(8)根据第四步的first集和follow集计算预测分析表M。

(8.1)对于语法规则表中的中的每一个语法规则A:=a,执行(8.2)(8.3)两步:

(8.2)如果终结符b在a的first集中,则把A:=a加入到M[A,b]表项中。

(8.3)对于任何符号c在A的follow集中,把A:=a加入到M[A,c]表项中。

(9)分析完成,结束

3.词法分析模块

该模块的实现过程如图3所示:

(1)把用户编辑的脚本读入到缓冲区中。

(2)读取语法定义支持模块生成的“解析结果文件”。

(3)根据分隔符号(空格、回车),从当前缓冲区分离出一个单词。如果分离不成功则执行步骤(6),否则执行步骤(4)。

(4)在“解析结果文件”中的关键字列表中查找该单词,如果找到执行步骤(5)否则执行步骤(2)。

(5)从关键字列表中返回该单词所在位置,作为该单词的属性进行保存。

(6)词法分析结束。

4.语法语义分析模块

该模块分析过程如图4所示:

(1)初始化堆栈,把语法分析完成的结束标识符,记为‘#’和语法定义文件中的开始符号依次压入堆栈;

(2)从词法分析模块输出的单词串中读取一个单词符号,记为a,把当前堆栈顶符号,记为X;

(3)如果X=a≠‘#’,则

(3.1)查找语法规则表中关于当前堆栈顶符号X的语法规则,判断该语法规则中单词符号a是否需要存储,如果需要存储,执行步骤(3.2)。如果不需要存储,则执行步骤(3.3);

(3.2)把a的地址存放在参数表中,参数表记为paramTable。执行步骤(3.3)把X从堆栈中弹出。

(3.4)则转到步骤(2)继续执行;

(4)如果X是一个非终结符,则:

(4.1)则要查看预测分析表,将预测分析表记为M,从预测分析表M中查找对应的M[X,a]表项,如果该表项存有语法规则,执行步骤则(4.2)。

(4.2)首先把X从栈顶弹出,然后取出该语法规则中的一个符号,记为Y,如果取出操作成功则执行(4.3),否则执行步骤(4.5)。

(4.3)判断Y是否需要存储,如果需要存储执行步骤(4.4)。如果不需要存储,则执行步骤(4.2);如果M[X,a]表项对应为空值,则报告脚本中存在错误,语法分析终止;

(4.4)在paramTable中分配空间用于存储Y。执行步骤(4.5)。

(4.5)转到步骤(2)。

(5)如果堆栈顶符号X是语法定义文件中标识符中的ACTION符号,则:

(5.1)根据该语句的构成需要的空间大小计算出该存储该语句所需要的空间大小,继续执行步骤(5.2)。

(5.2)根据该语句占用空间大小进行空间分配,继续执行步骤(5.3)。

(5.3)最后根据paramTable把该语句存放在已经分配的空间内,继续执行步骤(5.4)。

(5.4)判断当前语句是否需要存储,如果需要存储,则执行步骤(5.5).否则执行步骤(5.6)。

(5.5)把求得的语句地址放入paramTable中,继续执行步骤(5.6)。

(5.6)则转到步骤(2)继续执行。

(6)如果X=a=‘#’,把paramTable表中最后一个参数即为该语义分析树的根节点,记为ROOT,把ROOT进行存储。

5.语义解释模块

语义解释模块实现过程如图5所示:

(1)取出语义分析树的根节点ROOT。

(2)对ROOT节点存放的语句进行解释。这时要结合该语句的含义进行解释,将解释后的语句内容作为参数放置在事件等待链表中等待绘制引擎模块触发执行;例如(例1)假设该语句含义为:t时刻,小车A从a位置移动到b位置,则对该语句的解释该语句内容应包包括一个开始时间t、运动位置A以及运动位置b,并且操作对象为A,则把(t,a,b,A)这些语句内容作为参数存放在事件等待链表中。

(3)判断ROOT节点是否有子结点,记为SUBNODE,如果有则执行步骤(4)。如果没有则执行步骤(5)。

(4)对SUBNODE及其所有子结点中存放的语句进行解释。该解释过程是一个中序遍历递归调用过程:

(4.1)把SUBNODE赋给临时节点CURRENT。执行步骤(4.2)。

(4.2)解释CURRENT节点,执行步骤(4.3)。

(4.3)取出CURRENT的子结点SUBNODE,如果SUBNODE不为空值,则把SUBNODE放入CURRENT中,执行步骤(4.2);否则执行步骤(5)。

(5)语义解释完毕。

6.绘制引擎模块

绘制引擎模块实现过程如图6所示:

(1)进行三维场景初始化,加载需要的模型;

(2)对需要绘制的下一帧进行如下过程:

(2.1)检查是否有用户请求;

(2.2)如果有则判断是何种请求;

a.如果是脚本执行请求,则进行加载词法分析模块、语法语义分析模块、语义解释模块对脚本进行词法分析、语法语义分析和语义解释;

b.如果是除了脚本执行请求外的其他请求,则进行相对应的处理;

(2.3)检查事件等待链表中是否有达到该语句所描述事件的触发时刻,如果有,则执行该语句(如例1所述,时间等待链表中某一个节点存放着(t,a,b,A),当系统当前时刻t2>t时,触发执行该语句的过程是调用A对象的相应方法:a.move(a,b)),然后继续执行步骤(3),如果没有,则继续执行步骤(3),直至有需要触发的语句;

(3)绘制当前帧,以三维的形式表现出来;

(4)转到步骤(2)继续,直到用户请求退出。

应用举例:本发明的系统及方法已经成功应用于第29届北京奥运会、残奥会开闭幕式文艺演出的筹备过程,成功完成了奥运会开幕式演出长达一个小时对上空地面机械设备、部分演出人物、以及演出道具的模拟。在2008年4月中旬,四天内仿真出《梦幻五环》的节目创意,并给张艺谋导演做了演示。证明了本发明系统及方法具有开发周期短、可维护性高以及便于使用的优点。

本发明未详细描述的部分属于本领域公知技术。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号