硬件加速器个性编译器的制作方法

文档序号:6377347阅读:252来源:国知局

专利名称::硬件加速器个性编译器的制作方法
技术领域
:本发明一般涉及用于控制通用计算机操作的应用和文档处理,并且尤其涉及对给定但任意的语言或格式的应用程序、文档和/或其它逻辑符号序列执行语法分析操作。
背景技术
:近些年来,计算机之间的数字通信以及将计算机连接到网络中的领域得到了迅速发展,它在许多方面都类似于前些年个人计算机的激增。远程处理互连性和可能性的这种增加大大提高了这种网络化系统中个体计算机的有效能力和功能性。然而,当计算机投入使用时,个体计算机和系统的使用多样性、它们用户的定位以及目前技术水平造成了单机和它们操作系统的能力和配置的高度多样性,单机和它们操作系统共同被称为“平台”,这些平台在某种程度上、尤其是在操作系统和编程语言级一般互不兼容。平台特征的这种不兼容性,以及同时对通信及远程处理能力和用于支持它的足够兼容度的要求,导致了面向对象编程(面向对象编程提供一种通过实体、属性和关系的参照系统将应用及数据编译为一组不同程度的一般化模块的概念)以及用于实施面向对象编程的许多编程语言的发展。可扩展标记语言(XMLTM)就是这样一种语言,XML已得到广泛使用,并且可以作为文档、在任意组成和体系结构的网络上传输。在这种语言中,某些字符串对应于某些命令或标识,包括某些专用字符和其它重要数据(共同被称为控制字),这些专用字符和重要数据允许数据或操作实际上识别它们自己,使得此后它们可以被处理为“对象”,以致关联的数据和命令可以被翻译成不同语言不同应用的适当格式和命令,以便产生足以支持给定机器上预期处理的各个连接平台兼容度。这些字符串的检测是通过一种被称为语法分析的操作来执行的,语法分析操作类似于更常规的把诸如句子的表达式的语法分解为其组成部分,并在语法上描述它们的用法。即使在其它可以被计算机搜索或相反被计算机处理的计算机编程语言和文档中,控制字也将限于有限的但可能很多,从而允许的符号序列将类似地被限制为内容的事件和语言的语法。此外,用于识别文档内容的文档语法分析已经证明是,一种通过检测可能代表攻击、未授权访问或其它可能安全性缺口的控制字来提供处理器和网络中安全性的重要工具。另外,或多或少具有复杂功能序列的其它许多设备如电话和/或诊断设备,响应取决于先前功能序列的类似刺激或输入,采用有限状态机来实现不同功能,而实际上许多这种设备的响应定制变得越来越需要,但是受产生与输入的预期响应序列相对应的状态表的困难的限制。例如,当对XMLTM文档进行语法分析时,中央处理器(CPU)执行时间的一大部分,并且可能主要部分,都花费在遍历文档、以便搜索如相对于正在处理的特殊XMLTM标准而定义的控制字、专用字符和其它重要数据上。典型地这是通过软件来执行的,该软件查询每个字符,并确定每个字符是否属于所关心的一组预定义串,例如包括以下“<command>”、“<data=dataword>”、“<endcommand>”等的一组字符串。如果检测到任何一个目标串,就将标记和指向文档中标记开始位置和标记长度的指针一起保存。这些标记被累积,直到整个文档都被进行了语法分析为止。对文档进行语法分析的常规方法是,用软件来实施基于表的有限状态机(FSM),以搜索所关心的这些串。状态表驻留在存储器中,并且被设计用于搜索文档中所关心的特定模式。当前状态用作状态表的基地址,并且输入字符的ASCII表示是表的索引。例如,假定状态机处于状态0(0)、并且第一个输入字符是ASCII值02,则状态项的绝对地址将是基地址(状态0)与索引/ASCII字符(02)的和/连接。FSM以CPU从存储器中取出输入文档的第一字符而开始。然后,CPU将绝对地址构造到存储器中与初始化/当前状态和输入字符相对应的状态表中,然后从该状态表取出状态数据。基于所返回的状态数据,如果不同(表示字符与所关心的串的第一个字符相对应),则CPU将当前状态更新为新值,并执行状态数据中指示的其它任何行动(例如,如果单一字符是专用字符,或者如果一旦进一步重复上述操作,就发现当前字符是所关心的串的最后一个字符,则发出标记或中断)。重复上述过程,并且当找到所关心的串的后续字符时,改变状态。即,如果初始字符被认为是所关心的串的初始字符,则FSM的状态可以前进到新状态(例如,从初始状态0到状态1)。如果字符不是所关心的,则状态机将(一般)通过在从状态表地址返回的状态表项目中指定相同的状态(例如状态0)(或者通过不命令状态更新),来保持相同状态。可能的行动包括但不限于,设置中断、存储标记以及更新指针。然后,对后面的字符重复该过程。应该注意,当正在跟踪所关心的串、并且FSM处于非0状态(表示还没有找到所关心的串或当前正在跟随所关心的串的其它状态),可以找到与当前串不一致,但是是另一个关心的串的初始字符的字符。在这种情况下,状态表项目将指示适当的行动,以便指出和识别先前跟踪的串片段或部分,并跟踪可能的新的所关心串,直到完全识别新串,或发现新串不是所关心的串为止。换句话说,所关心的串可能被嵌套,并且状态机必须能够在另一个关心的串内检测到所关心的串,等等。这可能要求CPU遍历许多次XMLTM文档的各部分,以便对XMLTM文档进行彻底的语法分析。然而,可以容易理解,FSM的状态表必定是给定计算机语言及其控制字和/或语法及句法所特有的。也可以理解,随着控制字和格式规则数的增大,状态表的尺寸必定变得非常大。此外,目前通常的做法是,产生制定完善,且使用日益频繁的工业标准语言的增强或扩展版本,并且任何计算机语言的任何修订或扩展都必定需要用于对那种语言文档进行语法分析的FSM状态表的相应修订。换句话说,由控制字给出的所有允许符号组合都必定反映在状态表中,并且表面上控制字组和/或语言语法的少量修订或扩展可能需要FSM状态表尺寸的大大修正或增加。较实际的做法是,手动地产生这些状态表、并将它们装载到FSM可存取的存储器中,以便在避免改变FSM硬件的同时适应语言的改变。FSM所针对的语言以及FSM对那种语言文档进行语法分析的能力,有时被称为FSM的“个性(personality)”。即使状态表的开发可能包括计算机语言或采用那种语言的应用程序的大部分开发费用,也不存在切实可行的备选方案来替换用于改变FSM个性的手动状态表产生过程。进一步,关于所有手动过程,手动产生状态表常遭受错误,必须在可以可靠使用FSM之前检测并校正这些错误。实际的效果是,在需要文档语法分析的情况下,开发状态表所需的时间造成了软件应用和修改及其扩展和升级的实施的延迟,即使在现代处理器和网络环境中这种语言修改、扩展和升级正变得越来越频繁。而且,在文档语法分析用作检测可能安全缺口的工具的情况下,当照这样识别出指示这种可能安全缺口的串时,应该尽可能及时地将所关心的串添加到状态表中,即使这种添加可能需要对用于这种用途的状态表进行大幅度修订。更一般的是,可能需要修改FSM个性,以改变包括FSM的设备的功能的任何情况,都可能受益于产生相应状态表的困难度、成本和错误灵敏度的减小。
发明内容因此,本发明的目的是提供一种用于简单且无差错地改变有限状态机状态表的技术和设备。本发明的另一个目的是,提供一种技术和设备在不进行硬件修改的情况下重新配置有限状态机,以及诸如包括有限状态机的硬件语法分析程序加速器的装置,以便尤其适应计算机语言和应用修改与扩展、或全新计算机语言和/或应用规范。本发明的又一目的是,提供一种用于产生状态转换表,并以诸如XMLTM的自描述数据格式记录它们的方法和设备。为实现本发明这些及其它目的,本发明提供一种用于执行方法和加载器的方法学和编译器,该方法和加载器优选地在诸如硬件语法分析程序加速器的装备内用软件来实施,该硬件语法分析程序加速器能够读取规范或概括预期可执行功能的规范,以产生输出,该输出能够被加载到可以由诸如语法分析加速器的包括有限状态机(FSM)的设备访问的存储器中,以便定制FSM的个性,而该设备又包括FSM。优选地,用形式记号如Backus-Naur形式(BNF)或其派生物、或其它正规表达式,来写语言或其它规范。基于这种输入,根据本发明的编译器产生相应的状态转换,来形成包括一个或多个状态表的状态转换规范。由以下参考附图的本发明优选实施例详细说明,将可以更好地理解本发明上述及其它目的、特征及优点,其中图1是本发明的高级示意框图,图2A是代表对理解本发明有用处的状态表的图,图2B是本发明一般化形式的基本操作的高级流程图,图3是本发明优选实施例的操作的高级流程图,图4是本发明优选实施例的高级上下文图,图5A、5B、5C、5D、5E、5F、5G、5H和5I显示了分组和识别语法规则定义中的子表达式,以及包括图6A和6B的图6显示了完全用自描述数据格式表示的输出状态表规范文件的例子。具体实施例方式参考附图,尤其是参考图1,图1显示了根据本发明的、且被连接以便向优选地为硬件语法分析加速器的设备中的有限状态机(FSM)提供状态表的个性编译器的基本形式的高级示意框图。最初,应该注意,可以把个性编译器100实施为可连接到存储器105的单独设备(例如在硬件语法分析程序加速器离线的情况下),然后当基于请求方式而需要时,可以访问存储器105以获得状态转换规范,以便由加载器110将状态转换规范加载到FSM状态表中、或者使状态转换规范与任意设备(由虚线120指示)中的FSM140相结合,以部分地或完全控制该状态转换规范,由此允许实时地或基本上实时地更新设备的个性。应该理解,在后一种情况下,基本上是实时的本发明操作,尤其是通过编译语言语法规范的替换版本加速实时操作而实现的基本上实时的本发明操作,允许本发明始终适于在输入流中遇到的模式和状态;由此在个性编译器以及包括FSM的设备中提供基本学习能力。通过相同的标记,应该理解,将在下面描述的产生中间结果的处理的一部分,如语法规范预处理(例如直到图2B的步骤250的处理或用于提供被归档存储的预产生状态表的处理),可以以单独的形式操作,并且当需要时处理从存储的数据(例如有限自动机或状态表)起开始操作。本发明的优选应用和环境连同如虚线130所示的硬件加速器一起被配置为集成的形式、或完全或部分单独的形式。与本发明的实施无关,回顾FSM状态表的性质对于理解本发明是有用的,尤其是就优选的硬件语法分析程序加速器环境而论。在全部在2002年12月31日提交并且被委派给本发明代理人的美国专利申请10/_,_,10/_,_和10/,_,_(事务所编号FS-00766、FS-00767和FS-00768)中,分别公开了三种不同的硬件语法分析程序加速器实施,它们在此整个被引入作为参考。图2A显示了其中公开的示范性状态表的一部分。应该理解,图2A所示的状态表潜在地只是用于对文档进行语法分析的状态表的很小一部分,并且其本质上意图作为示例。虽然至少在所示的形式上、完整的状态表通常在物理上不存在,并且图2A也可用于方便理解公知软件语法分析程序的操作,但是图2A中没有一个部分被认为是关于本发明的先有技术。应该注意,XMLTM文档在此用作可以利用根据本发明的加速器处理的一种逻辑数据序列的例子。也可以根据意图被共享服务器计算机执行的网络数据分组内容、如用户终端命令串,来构造其它逻辑数据序列。(这种命令串经常由恶意用户产生,并且被发送给共享计算机作为长期入侵企图的一部分。)根据本发明的加速器适合于处理多种这样的逻辑数据序列。注意到图1所示状态表的一部分是复制的也将是有用的。方便且优选的是,将符号的十六进制表示用作状态表索引,并据此将状态表的垂直列标定为“00”至“FF”。对行进行编号,以反映FSM可以呈现的各种状态。从而,将多行基地址分成与可以用于代表文档中要被执行语法分析的字符的代码的数量相对应的许多列;在该例子中,分成与字符的基本8位十六进制字节相对应的256列。可以以这种形式提供和可能需要的、可打印或不可打印的字符一样多的字符。注意到所示状态表项目的几个方面将是有用的,尤其是在理解图1所示示范性状态表的多小部分支持许多字检测的方面1.在所示的状态表中,在状态为0的行中只有两项包括不同于“保持在状态0”的项,当正在测试的字符不和任何关心的串的初始字符匹配时,“保持在状态0”项维持初始状态。为前进到状态1作准备的单项对应于所有关心的串都以相同字符开始的特殊情况。将为前进到另一种状态作准备的其它任何字符一般将、但不一定前进到不同于状态1的状态,但是对可以通过另一个字符到达的相同状态的进一步参考可能对例如检测嵌套串有用处。把{状态0,FD}所示的具有“保持在状态0”的命令(例如“特殊中断”)包括进来,将用于检测和操作特殊单字符。2.在状态0以上的状态中,“保持在状态n”项为通过例如可能在命令数值变元中遇到的一个或多个字符的潜在长行程来维持状态作准备。本发明提供对这种类型字符串的特殊处理,以便提供增强的加速,如将在下面详细讨论的。3.在状态0以上的状态中,“转到状态0”项表示检测到把串和任何关心的串区分开的字符,而与先前已检测到多少匹配的字符无关,并且“转到状态0”项使语法分析过程返回到初始/默认状态,以便开始搜索另一个关心的串。(为此,到目前为止,“转到状态0”项一般将是状态表中出现最频繁或最多的项。)返回到状态0可能需要语法分析操作返回到文档中在检测到区别字符时跟踪的字符串的开始字符之后的字符。4.包括具有“转到状态0”的命令的项指示对所关心的完整串的检测的完成。一般来说,命令将要存储此后允许串被处理为对象的标记(和标记的地址和长度)。然而,具有“转到状态n”的命令为起动中间点操作、同时继续跟踪可能潜在地和所关心的串匹配的串,作准备。5.为避免搜索在两个关心的串之间发生分支的任何点处的模糊性(例如具有n-1个相同初始字符、但具有不同的第n个字符的两个串,或具有不同初始字符的两个串),一般需要继续进行到不同(例如不连贯)状态,如{状态1,01}和{状态1,FD}所示。除特殊字符所包括的串和所关心的串具有共同初始字符的特殊情况以外,完全识别任意长度n的串将需要n-1种状态。为此,即使对于较适度的所关心串的数量,状态表的状态和行的数量通常也必定很大。7.与前一段相反,大多数状态都可以完全由一个或两个唯一的、且默认值为“转到状态0”的项来表征。本发明利用图1状态表的该特征,以便相对于所关心的串的一般情况、获得硬件高度节约及语法分析过程的大幅度加速。如常规地执行的语法分析操作以处于给定默认/初始状态如图2A中状态0的系统开始,然后一旦重复过程,当找到所关心的字符串的匹配字符时,语法分析操作就前进到编号更高的状态。当所关心的串被完全识别、或者当在潜在地是匹配串的串中的中间位置指定了特殊操作时,执行诸如存储标记或发出中断的操作。然而,每当对文档的每个字符重复操作,都必须从CPU存储器中取出字符,必须取出状态表项目(再次从CPU存储器中),并且必须在顺序操作中更新各种指针(例如指向文档字符和状态表基地址的指针)和寄存器(例如寄存初始匹配字符地址和累积串长度的寄存器)。以上引入的应用中所公开的硬件语法分析程序加速器通过为并行执行这些操作中的许多操作作准备、同时通过其中的有限状态机评定文档的后续字符,来加速语法分析过程。总之,语法分析程序的基本功能是,唯一识别所关心的输入字符(例如符号或二进制信号序列)串,并且一旦实现这种识别就发出唯一标记和其它信息。在某些情况下为了某些目的,也必须检测和验证所关心的嵌套串的识别。因此,重要的是认识到,能够导致标记发出的所有字符串都是被执行语法分析的文档的语言的、如通过那种语言的控制字和特征句法定义的事件。相反,就语言规范而论,由控制字和/或它们的顺序排列表示的语言事件也可以被认为是标记。从而,语言规范包含足够的信息,用于语法分析程序为给定语言或一组关心的字符串定义能够导致标记发出的所有关心的字符串,从而足以产生要识别所有关心的字符串的状态表。参考图2B,图2B显示了本发明一般化形式的操作流程图。一旦调用过程,“下一个标记”就被调用,如210所示。假定,只有在按照表示语言规范的数据的连续顺序的语言规范中,才存在某种顺序。在存在顺序的意义上,实际顺序可以是任意的,并且在任何情况下都不影响将被开发的状态转换规范的可用性,因为语法分析程序被配置成识别任何顺序的所关心串。标记的顺序可以影响所分配的状态号,但是那些状态号没有实际意义。即,任何关心的串都将造成通过状态表状态序列前进,以达到所关心的串将被唯一识别的终结状态,但是状态和状态序列的数量对结果没有影响。从而,“下一个标记”的调用用于通过使整个过程循环直到所有标记都被考虑为止,来提供一种促使考虑整个语言规范的机制。优选地,通过读取语法输入文件215、识别语法实体如字符/符号的控制字和句法要求(例如分支语句、字符定界域等)、并通过将唯一标记分配给每个被识别的实体来标记化它们,以执行该操作。在该过程中也可以考虑和应用特殊匹配规则或准则(例如指定任意字符的数量)。在图2B的220集体指出这些功能。该过程将导致如230所示的用于某些语法实体(如代表语言中提供的命令的控制器)的一组转换图或有限自动机(以下可以通过该术语来参考这种转换图),而其它语法实体如递归分支语句和定界符符号将需要附加处理和变换,来获得可以在状态表中表示的字符串。具体地说,在240,对还没有被变换为字符串的剩余语法规则进行测试,以确定它们是递归的、还是表示其它性质如“排除”操作。如果需要,根据该测试,在245简化语法规则,以便将语法规则表示为字符串、或者将语法规则扩展为扩展语法规则。在这一点上,执行246的用于复制如循环249所示的步骤的嵌套子过程,以便为递归符号产生一组新有限自动机。该递归符号变为这组新有限状态机的起始状态,并且嵌套子过程内遇到的任何附加递归符号将被处理为好像是文字符号。文字符号是能够直接用作状态转换输入的符号。在返回到230的主处理步骤之前,为递归符号产生的一组新有限自动机被保存在存储器中,以便稍后进行处理,并且递归符号被标示为语法规则中的文字符号,使得当处理返回到步骤230时,它中断递归。然后,通过循环到210来重复过程,如以上提到的循环249所示,直到所有语法实体都被考虑到,并被处理以形成完整的有限自动机序列或状态转换图为止。现在,在获得被表示为有限自动机序列的完整语言语法之后,处理继续以250的起始状态开始。状态转换图由状态节点和转换标签边缘组成。标签边缘识别两种信息输入(例如转换条件)和下一状态。如果相同输入(例如字符)可以造成转换到不同状态的多种转换,则有限自动机被称为非确定性的。230的变换处理既产生非确定性有限自动机(NFA)、又产生确定性有限自动机(DFA)。NFA不适于构造硬件加速器FSM的状态表。在260执行检查,以挑出NFA。然后,在265通过使具有确定性质的状态退缩为闭集,来将NFA变换为DFA。从而,形成闭集的这些状态被组合,然后被代表闭集的新状态替代。然后,在标签边缘进入和离开新状态的情况下,调节状态转换。适于该变换的合适技术对于编译器设计领域的技术人员是周知的,在“PrinciplesofCompilerDesign(编译器设计原理)”byAhoandUllman,Addison-WesleyPublishingCo.,1977,pp.91-93中,给出了教科书例子。通过268的循环,对附加状态重复变换。在所有NFA都被变换为DFA之后,则可以在270优化DFA,并且在280,在把优化的DFA加载到FSM之前将其变换为状态表数据存储在大容量存储器中,或者将优化的DFA直接加载到FSM中。既然状态以及语言主要部分的状态转换完成了,则在循环292对在245识别的每个递归符号都重复将有限自动机变换为状态表的过程。在290,识别出具有还未被变换为状态表的有限自动机的递归符号表中的每个递归符号。在295,专门为递归符号初始化新状态表。该新状态表不一定是物理上分开的表。可以将该新状态表附加到早先产生的语言主要部分的状态表上。在此为简化描述,在逻辑上把该新状态表看作是分开的新状态表。在296,把先前为递归符号产生的有限自动机收集在一起,使得再次从步骤260开始执行将有限自动机变换为状态表的相同过程。重复292的循环,直到所有递归符号都被变换为状态表为止。上述描述作为本发明一般形式的概要,现在将参考图3至图6来描述本发明的优选实施例。优选实施例针对于产生针对特殊XMLTM形式的状态表。然而,应该理解,可以以各种形式、在各种实施例中,以及为不同目的、如检测潜在安全缺口企图(潜在安全缺口企图可能使用多种计算机语言中任一种语言的某些命令)或仅仅辨别特殊命令、句法等,来使用本发明。本领域技术人员应该理解,图3所示的本发明优选实施例的操作基本上是图2B一般化流程图的扩展。另外,图3的操作被显示为顺序的、而没有分支操作,这对于快速执行是优选的,同时足以适应XMLTM。为进一步加速处理,优选地通过在产生表中提供中间和临时存储器来避免某些分支,使得只有需要进一步处理的语法实体才保持在处理流中。一旦起动过程,就读取语法文件,并识别和标记化语法实体,如310所示。然后,将标记化的语法规则存储在产生表中,如320所示。然后,将语法规则操作尽可能地变换为字符串(字符集),如330所示。如以上提到的,优选地将语法文件表示为形式记号,如Backus-Naur形式(BNF)或其派生形式,如扩展Backus-Naur形式(EBNF)。环球网联盟以这种形式来使XMLTM文档化,并且普遍地可以以电子形式得到它。EBNF记号的概要描述如下语言由符号组成,该符号具有一组控制符号怎样能够被正确组合在一起的规则(语法)。每条EBNF语法规则都被规定如下符号∷=表达式语言以起始符号开始,并且用右手边表达式来定义符号,如以上使用附加符号、描述符、属性和算子的记号所示。在后续规则中定义新的符号,直到为语言定义了所有符号为止。可以出现在右手边表达式中的符号描述符、属性和算子被定义如下#xN其中N是十六进制整数,表达式匹配ISO/IEC10646中的,当被解释为无符号二进制数时、其规范(UCS-4)码值具有所示值的字符。#xN形式中的前导零数目是无意义的;相应码值中的前导零数目由使用中的字符编码决定,并且不重要。,[#xN-#xN]和具有所指示的包括范围中的值的任何字符匹配。,[#xN#xN#xN]和具有所枚举的字符中的值的任何字符匹配。可以在一组括号中混合枚举和范围。,[^#xN-#xN]和具有不在所给出的字符中的值的任何字符匹配。可以在一组括号中混合枚举和禁值范围。″string″和双引号内的文字串匹配。′string′和单引号内的文字串匹配。可以对这些符号进行组合,以匹配如下的更复杂模式,其中A和B代表简单表达式(表达式)表达式被处理为单元,并且可以如该列表所述那样组合表达式。A?匹配A或什么都不匹配;A是任选的。AB匹配后面接着B的A。该算子具有比“择一(alternation)”高的优先权;从而AB|CD和(AB)|(CD)是相同的。A|B匹配A或B,但是不匹配A和B两者;也被称为“择一(或)”。A-B和匹配A但不匹配B的任何串匹配;(从A中排除B)。A+匹配A的一次或多次出现。连接具有比“择一”高的优先权;从而A+|B+和(A+)|(B+)是相同的。A*匹配A的零次或多次出现。连接具有比“择一”高的优先权;从而A*|B*和(A*)|(B*)是相同的。产生过程中使用的其它记号(或规则组)/*…*/表示注释。使用以上记号来定义XMLTM″Name″的例子如下Namechar∷=Letter|Digit|′.′|′-′|′_′|′′Name∷=(Letter|′_′|′′)(Namechar)*假定′Letter′表示字母字符、′Digit′表示数字字符0-9,则XMLTM′Name′是以字母、下划线或冒号开始、接着是零个或多个′Namechar′的字符序列。′Namechar′是字母字符、数字字符、句号、破折号、下划线或冒号。应该理解,上述一些记号指定了“排除”操作(例如A-B)。在332辨别这些记号,并在334将这些记号变换为能够被表示为字符集字符串的简单规则。接着,在340识别递归语法规则。例如,考虑以下两条XMLTM语法规则cp∷=(Name|choice|seq)(′?′|′*′|′+′)?choice∷=′(′S?cp(S?′|′S?cp)+S?′)′″cp″和″choice″两者的扩展相互参考。将符号″cp″或″choice″的定义代入语法规则表达式的右手边将导致无限长度的表达式,这是由于cp和choice相互参考的语法规则所引起的递归造成的。优选地,在342,在将语法变换为一组有限自动机之后可以丢弃的临时存储器中,从起始符号起、从语法产生来扩展这些规则,将此刻的递归符号处理为特殊文字符号。文字符号是一种被它自己用作状态转换输入的符号。这将导致整个语言的完整连续语法规则。在此被临时处理为文字符号的递归符号将在344被处理。在344,先前识别的每个递归符号都用作新扩展的起始符号,新扩展将以递归符号的完整连续语法规则结束。它使得能够专门为每个递归符号产生一组新有限自动机。稍后,将在过程中根据该步骤所产生的有限自动机来产生这些递归符号所关联的一组状态。为进一步说明在将把递归符号变换为状态之后怎样处理递归符号,在此我们将简要描述加载器(图1中的110)内的功能。加载器根据由硬件加速器个性编译器(HAPC)产生的状态信息,来填充硬件加速器FSM内的状态表。除状态识别和状态转换以外,HAPC还识别去往加载器的所有递归符号,如图6所示。当加载器处理涉及递归符号的状态转换时,加载器识别出递归符号。加载器不是使FSM立即转到下一状态,而是把作为该特殊转换动作的命令加载到FSM中,以便将下一状态信息推进硬件加速器内的堆栈中,并分支转到递归符号语法规则的起始状态。对于递归符号语法中的每个终结状态,加载器都把作为终结状态动作的命令加载到FSM中,以便从堆栈中托出状态信息,并转到从堆栈中托出的下一状态。如果遇到了作为输入被嵌入递归符号语法规则的状态内的递归符号,则加载器执行和刚才描述的操作相同的操作。作为取得语法规则中递归定义的结果,硬件加速器内的堆栈使得能够处理这些嵌套的状态转换。然后,根据扩展语法规则产生NFA,并将所产生的NFA变换为DFA,如上述355所示。然后,可以优化DFA(360),并将优化的DFA变换为状态表项目(370),然后存储该状态表项目,如上所述。优选地,把以上操作提供为根据面向对象编程概念的软件对象。如本
技术领域
中容易理解的,对象实质上是把它们的操作(与程序整体功能和对象自身之间交互作用的功能有关的操作)封装和隐藏起来的较大程序,同时如果需要,对象能够调用其它对象来执行程序。也可以将对象装配为具有形成图4所示上下文的关系的类。在以下对软件对象类以及其中的对象的描述中,对象以及所提供的对象功能的描述足以成功实行本发明,并且对象所封装的对象进一步细节对于本发明的成功实行是不重要的。如图4所示,根据本发明的HAPC包括主HAPC类和十二个附加类1.InputMgr2.Token3.RuleMgr4.ExpandedRule5.CharSet6.RecursiveSymbolMgr7.RSEntry8.NFAMgr9.StateMgr10.StateEntry11.TransitionEntry12.DFAMgr以下将按顺序对它们进行讨论。HAPC类包含用于命令从读取输入、执行编译处理、直到写输出的执行的主程序和方法。InputMgr类对象负责对来自语法规则规范文件的输入进行标记化。Token类对象定义所支持的标记种类,并对访问、设置和更新标记提供支持。RuleMgr类对象把标记化的语法产生规则组织在散列表中,以允许软件能够快速访问语法规则。CharSet类对象对语法规则中的字符集实体提供专门支持。ExpandedRule类对象提供一种用于从特定标记开始将语法规则改进为连续语言规则的工具。RecursiveSymbolMgr类对象提供一种用于识别在语法规则定义中递归使用的符号的仓库。RSEntry类对象定义递归符号仓库项目格式。NFAMgr类对象对从语法规则创建非确定性有限自动机提供支持。StateMgr类对象管理一种包含用于创建状态表的状态转换信息的仓库。StateEntry类对象定义用于状态仓库中项目的格式。TransitionEntry类对象提供一种用于存储状态转换信息的工具。DFAMgr类对象对把非确定性有限自动机转换为适于产生状态表的确定性有限自动机提供支持。HAPCHAPC类包含用于开始整个编译过程的主程序。除主方法以外,HAPC类还包含以下方法genStateswiteStateTransitionstimestampToStringgenStates方法是编译过程的主驱动程序。genStates方法创建其它类对象、并与所创建的其它类对象对接,以便读取输入语法规范、将语法规范信息处理为有限状态、并将状态转换信息写出到文件。writeStateTransition方法为HAPC所产生的状态转换规范创建输出流,并将信息写出到输出文件。timestampToString方法是一种支持writeStateTransition方法、以便将timestamp(时间戳)信息格式化为可打印串的实用方法。InputMgr硬件加速器个性编译器输入管理程序InputMgr负责读取包含语言语法规则的输入文件、并将输入规则数据编码为标记。输入文件中的信息被分解为标记,使得能够通过它们的种类来容易地识别它们。InputMgr类支持以下构造程序和方法InputMgrnext_tokenstartNewSectionnext_lineparseCharLiteralInputMgr构造程序设置Java缓冲区头,以便读入输入语法规则文件。输入语法规则文件由以下三个部分组成用户指令,产生规则,以及产生规则重载。这三个部分通过始于且只包含两个字符%%的行,而相互分开。用户指令部分首先出现在文件的开头。所有用户指令关键字都以″%″为前缀。当前,唯一支持的用户指令是具有一个变元的%StartSymbol。该变元指定在产生规则部分中定义的语言的起始符号。符号集内围起的注释/*和*/可以出现在输入文件中的任何地方。产生规则部分包含要处理的语言的语法规则。当前,假定用EBNF格式来表示语法规则。产生规则的所有左手边符号都必须始于第1列。产生规则可以跨越许多行。所有续行都必须始于第1列的至少空白字符。产生规则重载部分是最后一部分,并且是任选的部分。产生规则重载部分允许用户重新规定早先出现在产生规则部分中的某些产生规则。当所有语法规则都由语言创建者定义时,这允许用户规定所有语法规则、而不对产生规则部分进行任何改变。如果某些规则具有一些不能被该软件自动处理的记号,用户可以仅仅利用产生规则重载部分中该软件所支持的记号,来重新规定那些规则。在调用InputMgr构造程序之后,HAPC软件可以开始通过重复调用next_token方法,每次一个标记从输入文件中提取整个输入语法产生规则。最初,通过识别从输入文件创建的输入字符流中的定界符字符,来形成每个标记。然后,将标记分类为不同的标记种类。在Token部分中进一步详细描述这些标记种类。InputMgr透明地处理格式化信息,并跳过输入文件中的所有注释。对于输入文件中被指定为数值的字符文字,在对它们进行标记化之前,通过parseCharLiteral方法在内部将它们转换为字符值。startNewSection是一种允许调用程序使InputMgr从“规则部分结束”状态复位、由此允许软件读入附加产生规则来重载某些先前语法规则规范的简单方法。构造程序、startNewSection和next_token方法是InputMgr类对象的主要外部接口。InputMgr类中实施的其它私有方法有next_line和parserCharLiteral。私有方法next_line从输入文件得到一行字符,并将输入行的剪切型式返回给调用程序。next_line方法保持输入文件的行计数,并剪掉输入文件开始和结尾处的空格。另一私有方法是parseCharLiteral。parseCharLiteral方法把被表示为十六进制数的字符文字转换为内部ASCII字符。这允许以和可打印字符相同的方式,来在软件内处理不可打印的字符。TokenToken类提供一种创建和维护标记的工具。通过将输入字符流分解为标记,软件可以容易地对输入文件中的每个逻辑字符序列进行分类,并据此处理信息。有7种主要标记种类控制;符号;算子;属性;组;杂项(Misc);及未知。控制种类内的最重要标记是文件结束(EOF),EOF向软件指示到达了输入文件结尾。控制种类中也定义了其它少数标记,然而,它们仅供软件内短暂使用。因为这些少数标记对根据本发明基本原理的本发明实行不重要,所以在此将不详细描述它们。属于符号种类的标记包括StrProd(开始产生)、Symbol(正规语法符号)、RecursiveSymbol、Literal、Set和CharSet。StrProd标记被创建用于存储新语法规则的名称。Symbol标记表示一般语法规则符号。RecursiveSymbol是一种在软件确定在语法规则中递归使用符号之后、从一般Symbol标记重新分类的标记。当对单字符、字符的数字表示以及字符串进行标记化时,将它们标示为文字。在对字符的数字表示进行标记化之前,将字符的数字表示转换为正规ASCII字符。通过这样做,用同样方式来处理所有字符。方括号围起的输入串被分配给Set标记。Set标记可以具有某一离散字符集合、或某一字符范围。当集合内的值被处理为标示属于该集合的每个单字符的位集合时,Set标记被转换为CharSet。利用语法规则中的“择一”算子关联在一起的字符也被归合到CharSet中。算子标记是自明(self-explanatory)的。这些算子用于语法规则中,用来组合和混合语言基本实体,以形成更复杂的实体。属于算子种类的标记有OpExpInto;OpOr;及OpExclude。在EBNF记号中OpExpInto是″∷=″符号。OpExpInto向软件指示,标记序列将紧接着该标记之后,并且它们将形成刚好在该标记之前出现的左手边符号的扩展规则。OpOr是“或”算子,在EBNF记号中以“|”符号表示。OpExclude是“排除”算子,在EBNF记号中以“-”符号表示。早先在形式语法部分中描述了这两个算子。属性标记用于描述语言特定规则中的符号的允许出现频率。属性种类中的标记包括AttZeroOrOne;AttZeroOrMany;及AttOneOrMany。AttZeroOrOne在EBNF记号中以“?”字符来表示,并用于指示刚刚在该标记之前出现的符号是任选的符号。在语言内的该特殊上下文中,那个任选符号可以出现0次,或刚好出现一次。AttZeroOrMany在EBNF中以“*”字符来表示,并用于指示刚刚在该标记之前出现的符号可以在当前上下文中出现0次或多次。同时,AttOneOrMany类似地允许先前标记化的符号出现一次或多次,并且在EBNF中以“+”字符来表示。组种类(Groupcategory)具有两种定义的标记LParen和RParen。LParen表示组开始,而RParen表示组结束。通过左括号和右括号所围起的表达式,来定义组。组内的整个表达式被处理为单元。组可以被嵌入另一个组内。杂项种类(Misccategory)包含元标记。这些标记包括BlockStart;BlockEnd;及RecExp。这些标记被插入内部产生表所存储的语法规则中,主要供调试之用。作为状态转换产生过程的一部分,从“语言起始符号”开始成行扩展语法规则,直到所有符号都变为终结符号或递归符号为止。当然不成行扩展递归符号,这是因为递归扩展将导致无限循环,如上所述。为帮助调试,将BlockStart和BlockEnd标记插入在成行扩展期间得到的规则中,以识别扩展的规则内的规则段的开始和结束。标记包含来自原始输入产生规则的左手边符号名,以帮助识别。RecExp指示递归表达式。未知标记种类是一种在解析未知标记时、或者在把未知标记作为错误报告给用户之前,被软件用来临时保存该未知标记的位置容器种类。Token类提供构造程序和以下方法TokenequalssetTokengetCategoryisCategoryControlisCategorySymbolisCategoryOperatorisCategoryAttributeisCategoryGroupisCategoryMiscprintToken构造程序和setToken方法允许调用程序从头开始构造标记。调用程序可以利用getCategory、equals和各种isCategoryXXXX方法,来执行标记查询。print方法将向屏幕打印与标记有关的所有信息。RuleMgrRuleMgr类提供一种在被称为ruleTable的散列表(hashtable)中创建并维护语法产生规则的工具。语法产生规则的右手边表达式被存储为标记矢量。通过把产生规则的左手边符号用作散列关键字,将矢量保存到散列表中。RuleMgr构造程序提供一种初始化RuleMgr类的普通机制。RuleMgr类提供其它方法来帮助构造ruleTable,以便查询ruleTable、执行转换、以及支持调试。这些方法是parseEBNFRulescheckRulecomponentLengthextractCharSetreplaceGroupsWithCharsetsconvertCharSetEntitiesfindExclusionfindAlternationgroupRightAltParamgoupLeftAltParamgroupAltParamsprintRulereplaceRuleparseEBNFRules是RuleMgr类提供的一种重要方法。parseEBNFRules允许调用程序从输入语法文件中提取语法规则规范。parseEBNFRules方法利用传入的InputMgr来读取语法文件。然后,parseEBNFRules方法将每条产生规则重新构造为标记矢量。规则被保存到ruleTable中,并且通过规则的左手边符号来检索每条规则。checkRule方法允许调用程序确定ruleTable中是否已定义规则。这消除了调用程序直接访问实施ruleTable的散列表的需要。给定语法规则的符号名,componentLength方法返回为定义语法规则所需的标记数。该方法的典型用途是,确定在语法规则表达式中规则是否只有单一组成部分(例如集合)。extractCharSet方法检查如作为输入的一对索引所指定的语法产生规则的一段标记矢量,并确定是否可以将表达式子集分解为CharSet。如果可以将表达式子集变换为CharSet,则extractCharSet方法将把CharSet返回给调用程序。该方法支持convertCharSetEntities方法。replaceGroupsWithCharsets方法经历传入的包含标记序列的矢量,并用字符集(CharSet)代替所有合适的表达式子集。该方法支持convertCharSetEntities方法。convertCharSetEntities方法经历整个ruleTable,并将所有集合和符合条件的表达式子集变换为CharSet。findExclusion方法经历整个ruleTable,并找到包含“排除”算子的所有语法产生规则。在完成后,该方法以矢量形式返回那些语法规则。findAlternation方法经历整个ruleTable,并找到包含“或”算子的所有语法产生规则。在完成后,该方法以矢量形式返回那些语法规则。如果还没有用括号来分组子表达式,groupRightAltParam方法在语法规则中“或”算子的右手边子表达式周围添加一对括号。如果还没有用括号来分组子表达式,groupLeftAltParam方法在语法规则中“或”算子的左手边子表达式周围添加一对括号。如果还没有用括号来分组子表达式,groupAltParam方法在语法规则中“或”算子两边的两个子表达式周围添加一对括号。printRule方法通过向屏幕打印用输入左手边符号命名为标记序列的语法规则,来提供调试支持。replaceRule方法代替如用输入符号命名的语法规则的标记矢量。ExpandedRuleExpandedRule类的主要用途是,提供一种从起始符号开始扩展语法规则,并继续成行扩展所有产生规则、直到所有规则符号都被改进为字符集、字符串文字或递归符号为止的工具。字符集和字符串文字是能够被进一步改进的终结符号。由于递归符号递归进入相同状态的性质,递归符号需要堆栈执行其状态转换。单独的特殊过程将被执行,以处理递归符号。尽管为规则扩展起见,它们也被处理为好像是终结符号。提供两个构造程序,来扩展传入的RuleMgr对象中包含的语法产生规则。为提供对多个规则表的独立处理,RuleMgr成为构造程序的输入变元。构造程序所需的另一个输入变元是“语言起始符号”。这向构造程序提供扩展规则的起始点。两个构造程序之一还需要布尔标志变元,以指示是否需要压缩所得到的扩展产生规则。通过避免产生主要为调试目的而产生的标记、尤其是杂项标记,并积极将规则段变换为字符集,来执行压缩。这些构造程序是调用程序需要用来扩展语法规则的主要接口。构造程序将调用内部私有方法来成行扩展产生规则,导致了覆盖整个语言的单一语法规则。在扩展规则的过程中,这些方法也将识别递归符号。在扩展工作中,这些递归符号被处理为好像是终结符号。构造程序也将递归符号保存到RecursiveSymbolMgr所维护的表中,以便以后进行处理。在最高级产生规则已被扩展之后,调用程序可以调用“expandAllRS”方法,来扩展被构造程序识别和保存的所有递归符号。expandAllRS和performSimpleExclude方法是ExpandedRule类中的所有其它外部接口。expandAllRS方法从RecursiveSymbolMgr类得到所有递归符号的列表,并且每次一个地扩展每个递归符号。类似于最高级扩展,在扩展过程期间遇到的任何递归符号都将被处理为终结符号。这些递归符号将造成在状态转换表生成期间产生特殊动作码,使得该特殊动作码可以请求堆栈支持递归。performSimpleExclude方法经历扩展的语法规则,以定位“排除(-)”算子。对于performSimpleExclude方法所遇到的每个“排除”算子,如果确定“排除”操作的操作数是具有字符文字的字符集、或两个字符集,则performSimpleExclude方法将立即执行“排除”操作,并用所得到的字符集来代替语法规则中的操作表达式。ExpandedRule中的其余方法是私有方法。这些方法是initisOnTheStackexpandexpandRSinit方法帮助构造程序初始化类变量,以及起动语法规则成行扩展处理。isOnTheStack方法向构造程序提供内部支持,以确定语法符号是否为递归符号。软件通过将每个被扩展的符号推进堆栈中,来记住沿着扩展链的语法符号。一旦符号被完全扩展,该符号就从堆栈被托出。在扩展符号之前,代码检查符号是否已经在堆栈上。如果情况是这样的,则将符号识别为递归符号。expand方法是一种通过获得它所遇到的每个非终结符号的右手边表达式、并用表达式来代替符号,来执行语法规则成行扩展的递归方法。expand方法从起始符号开始,并且继续代替被扩展的规则中的每个符号,直到所有符号都变为终结符号或递归符号为止。堆栈用于在isOnTheStack方法中识别所有递归符号,如上所述。expandRS方法和上述expand方法很类似。expandRS方法支持expandAllRS方法专门为递归符号扩展语法规则。类似于expand方法,通过复制代表用ruleMgr中的非终结符号命名的产生规则的标记矢量、并用标记矢量代替被扩展的规则中的符号,来执行扩展。连续重复该过程,直到被扩展的规则的所有符号都成为终结符号或递归符号为止。如果在扩展期间遇到递归符号,包括正被扩展的递归规则符号自己,则该递归符号被处理为好像是终结符号。CharSetCharSet类支持一种用于存储语法产生规则中的表达式中所使用的有效字符集、或从语法规则中的子表达式得到的有效字符集的设置工具。最初在产生规则中指定的EBNF形式的字符集被封入一对方括号内。可以以多种方式表示方括号内的内容包含所有有效离散字符的字符序列某一字符范围被表示为十六进制值的单字符利用十六进制值表示的字符范围范围记号之外以上的组合CharSet类所提供的方法将处理所有这些指定有效字符集的不同方式,并将它们转换为相对于调用程序透明的CharSet对象。从CharSet类可以得到允许调用程序维护CharSet对象的附加方法。可以得到两个CharSet构造程序。无参数的构造程序允许调用程序设置一种要在稍后添加内容的CharSet对象。另一构造程序允许调用程序设置CharSet,并通过指定用如上所述的信息格式化的串来初始化CharSet对象内容。CharSet类中定义的方法有addremoveisInisEqualprintcharCountiterator有三种重载“add”方法。每种add方法都允许调用程序将更多字符添加到CharSet对象中。第一种变型允许调用程序利用如上所述的串格式指定多个字符。第二种add方法允许调用程序向CharSet对象添加字符。而第三种变型允许调用程序将另一CharSet对象的内容复制到当前对象中。有两种重载“remove”方法。第一种型式允许调用程序从当前CharSet对象中删除字符。第二种型式接收CharSet对象作为输入参数。它从当前CharSet对象中删除在输入CharSet中发现的所有字符。isIn方法允许调用程序查明当前在CharSet对象中是否有特殊字符。isEqual方法把另一个CharSet对象和当前对象进行对比,以确定它们是否具有相同内容。print方法是为调试目的而设的。print方法向屏幕打印CharSet对象的当前内容。charCount方法返回CharSet中当前的字符数。iterator方法将迭代程序对象返回给调用程序,允许调用程序每次一个地访问CharSet内的每个字符。为支持iterator方法,CharSet类也包含内部类CharSetIterator。CharSetIterator是Iterator接口的实施。RecursiveSymbolMgrRecursiveSymbolMgr维护散列表,允许调用程序设置表,以包含本质上递归的产生规则。递归符号表被InputMgr、ExpandedRule和NFAMgr类使用。RecursiveSymbolMgr类利用构造程序来生成Java散列表。因为是利用Java散列表来实施表的,所以利用散列表方法来执行对递归符号表的访问和维护。RecursiveSymbolMgr类不定义任何附加方法。RSEntryRSEntry类定义被实施为RecursiveSymbolMgr类中的散列表的递归符号表的项目结构。RSEntry类的用途是定义数据结构。因而,只提供构造程序来初始化类变量。数据结构中的所有字段都可以利用它们的本来的(native)方法来直接访问。NFAMgrNFAMgr类对把扩展的语法产生规则变换为NFA提供支持。NFAMgr类封装用于存储从扩展的输入语法规则产生的状态转换信息的StateMgr类。用NFAMgr构造程序来例示StateMgr。除构造程序以外,NFAMgr类也定义以下方法genStatesgenNFAfindLoopbackStatecheckAttributeNexteliminateDoubleEpsilonsoptimizeEpsilonTransitionsgenStates方法允许调用程序起动将扩展的语法规则变换为NFA的处理。输入扩展语法规则作为标记矢量被传入。然后,genStates方法调用递归genNFA方法,来将扩展的语法规则分解为可管理的段、并将这些段转换为状态转换。genNFA方法每次以递归形式处理一段输入扩展语法规则,直到整个语法规则被变换为完整的NFA为止。通过分组和识别语法规则定义中使用的普通子表达式,来执行处理,如图5A至5I所示。图5A至5I通过各个图中包含的标示显示了几种通常出现的被描述为以上定义的NFA的语言模式。例如,图5A显示了代表“a”出现零次或多次的模式“a*”;图5B显示了代表“a”出现零次或一次的模式“a?”;等等。相应模式的这种记号和逻辑处理是编译器中用于具体表示这些模式的众所周知技术。然而,因为一个输入,如ε(epsilon厄普西隆、空输入),可以造成多种状态转换,如图5D中的步骤2),所以最后必须将这种表示改变为DFA,如以上所提到的。优选地,在这一点上不以最优形式执行变换,以便产生普通状态转换模式,使分组和组合语法规则子表达式的结果变得容易。一旦生成完整的NFA状态转换序列,就将消除冗余状态,并将组合普通状态。findLoopbackState方法支持checkAttributeNext方法中的属性(即*+?)变换处理,以确定当前语法子表达式组的起始状态,使得可以正确地为每一属性添加一个或多个转换弧(transitionarcs)。checkAttributeNext方法查明是否为刚刚被变换为NFA序列的语法规则子表达式定义于属性。如果发现属性,则checkAttributeNext方法将在NFA中添加适当的转换,以满足属性规范。eliminateDoubleEpsilons方法优化NFA转换序列,以消除冗余状态转换。optimizeEpsilonTransitions方法消除完整NFA状态转换序列内的外来转换。StateMgrStateMgr类支持状态转换表的创建和维护。StateMgr类对NFAMgr类和DFAMgr类两者提供支持。类构造程序初始化类变量,并为状态转换表分配内存。另外,构造程序创建将NFA状态(旧状态)映射到DFA状态(新状态)的散列表,来支持DFA变换。StateMgr类中定义的其它方法有assignNewStaterecycleStateaddStateTransitionremoveStateTransitiongetAllOutTransitionsgetAllInTransitionsgetEpsilonOutTransitionsgetEpsilonInTransitionsgetEpsilonArcsgetNonEpsilonOutTransitionsgetNonEpsilonInTransitionsgetNonEpsilonArcsallocateEntryrecycleEntryupdateEntrygetEntrylocateStateprintStatisticsprintStateWithExtprintStatelistStatesWithNFAStateSetlistStatesWithClosureStateSetpeekNextNewStateNumwriteXMLOutputassignNewState方法保留状态表项目,并返回要用于新转换状态的相应状态号。recycleState方法允许调用程序将状态表项目释放回到池中,以便重新分配。addStateTransition方法根据输入转换信息,来创建从当前状态到下一状态的转换弧。addStateTransition方法也创建相对于调用程序透明的从下一状态返回到当前状态的反向链接。removeStateTransition方法删除两种状态之间的转换弧。removeStateTransition方法删除关于两种状态之间的相同转换的正向和反向链接。getAllOutTransitions方法把与指定状态相关的所有外出转换(outboundtransition)列表返回给调用程序。getAllInTransitions方法把与指定状态相关的所有进入转换(inboundtransition)列表返回给调用程序。getEpsilonOutTransitions方法把与指定状态相关的、由“空”输入造成的外出厄普西隆转换(outboundeplisontransition)列表返回给调用程序。getEpsilonInTransitions方法把与指定状态相关的进入厄普西隆转换(inboundepsilontransition)列表返回给调用程序。getEpsilonArcs方法返回与从传入的转换列表中取出的厄普西隆输入相关的转换列表。该方法主要为支持getEpsilonOutTransitions和getEpsilonInTransitions方法而存在。getNonEpsilonOutTransitions方法向调用程序返回把与指定状态相关的厄普西隆转换排除在外的所有外出转换列表。getNonEpsilonIutTransitions方法向调用程序返回把与指定状态相关的厄普西隆转换排除在外的所有进入转换列表。getNonEpsilonArcs方法返回与从传入的转换列表中取出的厄普西隆输入不相关的转换列表。该方法主要为支持getNonEpsilonOutTransitions和getNonEpsilonInTransitions方法而存在。allocateEntry方法从本地控制的状态表项目矢量中分配状态表项目。recycleEntry方法将状态表项目放到要重新使用的状态表项目列表上。updateEntry方法将状态项信息复制到StateMgr类对象内部维护的状态表矢量中的适当位置中。getEntry方法从内部状态表矢量检索与状态相关的信息。locateState方法对DFA变换提供支持。如果存在为匹配输入参数的一组NFA状态而生成的匹配DFA状态,locateState方法将找到该匹配DFA状态。printStatistics方法提供调试支持。printStatistics方法向屏幕打印出与内部受控的状态表相关的使用信息。printStateWithExt方法提供调试支持。printStateWithExt方法打印与具有为支持DFA变换而维护的附加信息的状态相关的所有信息。printState方法提供调试支持。printState方法打印与状态相关的所有信息。listStatesWithNFAStateSet方法返回包括指定NFA状态集的DFA状态列表。listStatesWithClosureStateSet方法返回作为厄普西隆闭包(epsilonclosure)一部分的状态列表。peekNextNewStateNum方法返回要分配给下一新状态的状态号。writeXMLOutput方法支持以XML格式将状态表写出到输出文件流。StateEntryStateEntry类定义状态表项目的内容。状态项包含三个主要字段状态号、外出转换弧列表、以及进入转换弧列表。有两个为支持DFA变换而定义的附加字段被替代的NFA状态集,以及空输入转换闭态集。类构造程序初始化字段,并创建关于外出弧和进入弧的矢量。StateEntry类支持状态表项目的创建和维护,StateEntry类也定义以下方法addToArcaddFromArcremoveToArcremoveFromArcdoesTransitionExistremoveArccompareNFAStatesprintToArcsprintFromArcsprintArcprintExtensionisInNFAStateSetisInClosureStateSetwriteXMLOutputaddToArc方法把当前状态的外出转换项添加到外出转换弧矢量上。addFromArc方法把当前状态的进入转换项添加到进入转换弧矢量上。removeToArc方法从外出转换弧矢量中删除当前状态的外出转换项。removeFromArc方法从进入转换弧矢量中删除当前状态的进入转换项。doesTransitionExist方法允许调用程序执行查询,以确定指定的转换是否和外出转换弧矢量中的任一转换项匹配。removeArc方法支持removeToArc和removeFromArc方法从传入的转换弧矢量中删除特殊转换项。compareNFAStates方法比较输入的NFA状态集是否和正被当前DFA状态代替的NFA状态集匹配。printToArcs方法提供调试支持,以便打印出当前状态的所有外出转换弧的信息。printFromArcs方法提供调试支持,以便打印出当前状态的所有进入转换弧的信息。printArc方法支持printToArcs和printFromArcs方法向屏幕打印出传入的转换弧矢量中存储的所有转换项信息。printExtension方法提供调试支持,以便向屏幕打印出状态项中维护的DFA变换支持信息。isInNFAStateSet方法提供DFA变换支持,以检查在当前状态项内维护的NFA状态集中是否已经包括特殊NFA状态。isInClosureStateSet方法提供DFA变换支持,以检查在当前状态项内维护的空输入闭态集中是否已经包括特殊NFA状态。writeXMLOutput方法支持以XML格式将状态表项目写出到输出文件。TransitionEntryTransitionEntry类为用于描述从一种状态转到另一种状态的转换弧的信息,定义数据字段。该信息包括造成状态转换的输入的类型;造成状态转换的输入的实际值;以及该状态转换所造成的下一状态的状态号。有六个类构造程序可用于初始化和设置适当数据字段中的输入数据信息,使得转换项已准备好使用。这些构造程序具有不同的输入参数来匹配转换输入数据类型。为TransitionEntry类定义了以下允许调用程序访问和更新数据字段的方法clearsetSymbolNamesetInputsetTransitionsetCheckedFlaggetInputTypegetCharSetgetInputChargetTransitiongetSymbolNamegetCheckedFlagisEqualcompareInputcopyInputprintwriteXMLCharInputwriteXMLOutDutclear方法将所有数据字段都设置为一种初始已知状态。setSymbolName方法将转换输入类型设置为“RELOCATE”,以指示可能需要分支转到另一状态表来处理递归符号。符号名作为输入参数被传入,并且被保存在符号名字段中以便以后参考。setInput方法由三种重载方法组成,它们的不同之处仅在于输入参数。第一种setInput型式不需要任何输入。它把转换项的转换输入类型设置为空(厄普西隆)输入。第二种型式需要字符输入参数。该方法将转换项输入类型设置为字符类型,并保存输入字符值。第三种型式需要CharSet输入参数。它将转换项输入类型设置为CharSet,并保存CharSet值。setTransition方法允许调用程序指定要转到的转换状态号。setCheckedFlag方法支持DFA变换。它允许DFA变换处理标明该转换项,使得该项只被处理一次,以便加速变换。getInputType方法把该转换项的输入类型返回给调用程序。getCharSet方法把该转换项的输入CharSet值返回给调用程序。getInputChar方法把该转换项的输入字符值返回给调用程序。getTransition方法返回该转换项中指定的转换状态号。getSymbolName方法把该项中存储的输入符号值返回给调用程序。getCheckedFlag方法把该项中的CheckedFlag当前标志设置返回给调用程序。isEqual方法对包括作为输入参数传入的转换项中存储的转换状态信息的所有值和该转换项中存储的那些值进行比较。如果这些值相同,则isEqual方法返回真;否则,返回假。compareInput方法对作为输入参数传入的转换项中存储的输入类型及输入值和该转换项中存储的输入类型及输入值进行比较。如果这些值相同,则compareInput方法返回真;否则,返回假。copyInput方法允许调用程序把输入类型和输入值信息从作为输入参数传入的转换项复制到当前项。print方法提供调试支持,以便向屏幕打印出该转换项的内容。writeXMLCharInput方法通过确定输入字符是否为可打印ASCII字符,来支持writeXMLOutput方法,并以适当的XML格式将输入字符输出到输出文件流。writeXMLOutput方法支持以XML格式将状态转换信息写出到输出文件流。DFAMgrDFAMgr类支持将NFA变换为DFA。DFAMgr类构造程序接收包含要被变换为DFA的NFA状态表的NFAMgr,作为输入。DFAMgr类构造程序还需要两个附加参数来指定NFA起始状态和NFA最终状态,使得DFAMgr能够将它们映射为DFA起始状态和DFA最终状态。构造程序创建新StateMgr,来维护要产生的新DFA状态。在DFAMgr类对象被构造之后,调用程序可以调用NFA2DFA方法来执行DFA变换。以下是DFAMgr所定义的方法列表createDFAStateNFA2DFAaddEpsilonOutStateseClosuregetNFATransitionSetextractNFAInputSetextractNFATargetStateSetfindDFAFinalStatesprintFinalStateswriteXMLOutputcreateDFAState方法支持NFA2DFA方法执行DFA变换。createDFAState方法为新DFA状态创建状态表项目。在创建状态项之后,createDFAState方法用关联的NFA状态集和厄普西隆闭集来初始化状态项。NFA2DFA方法是用于执行将NFA变换为DFA的主要方法。NFA2DFA方法使用某些公知编译器构造技术来将NFA变换为DFA。addEpsilonOutStates是一种为支持eClosure方法而存在的递归方法。addEpsilonOutStates方法以一种递归方式将厄普西隆(空输入)转换状态添加到来源于被映射到DFA状态的NFA状态集的闭集。eClosure方法建立并返回与作为输入参数传入的NFA状态集关联的厄普西隆闭态集。getNFATransitionSet方法建立并返回与作为输入参数传入的状态集关联的非厄普西隆转换项集合。extractNFAInputSet方法查看作为输入参数传入的转换项集合,并把从这些转换项中提取的输入集返回给调用程序。extractNFATargetStateSet方法查看作为第一输入参数传入的转换项集合,并返回具有与作为该方法第二输入参数传入的转换项中指定的输入匹配的输入的目标状态集。findDFAFinalStates方法返回被指定为DFA状态表中允许最终状态的DFA状态集。该DFA状态集是根据作为输入参数传入的原始NFA最终状态来确定的。printFinalStates方法提供调试支持,以便向屏幕打印出如通过NFA2DFA方法确定的DFA最终状态集。writeXMLOutput方法支持以XML格式把与DFAMgr创建的DFA相对应的状态表写出到输出文件流。参考图6,图6显示了被表示为XML文件的状态转换规范输出的例子。600的文件头识别文件内容、产生文件的日期、以及语法规则输入源。610的文件下一部分提供某些关于被指定的状态表的身份和布局的一般信息。在611,它识别该文件中描述的逻辑状态表数。加载器可以通过把来自后续逻辑状态表的状态附加到第一逻辑状态表上,并据此调节它们的转换,来把这些逻辑状态表组合成一个单物理状态表。(例如,如果物理状态表中的当前最后状态是1205。物理状态表中的下一可用状态项是1206。为了将下一逻辑状态表附加到物理状态表上,把在逻辑上被标定为状态0的初始状态加载到物理状态表项1206上。从逻辑状态表的所有状态转换都将被调节1206的偏移量。因此,如果有到逻辑状态表的状态5的转换,则在物理状态表中该转换将变为1211(1206+5)。)在612,它识别逻辑表的名称。递归符号它们自己用作递归符号逻辑状态表的名称。在613,它提供用于标定物理状态表列(状态输入)的信息。620的文件下一段提供关于每个逻辑状态表的详细规范。621的部分提供对该文件所指定的逻辑状态表的完整描述。它通过622的名称来识别表。然后,它在623识别该状态表的逻辑初始状态。624列出了允许最终状态。625指定了该逻辑状态表的状态数。626的文件部分识别该逻辑状态表的所有不同状态及其转换的详细信息。它首先提供如627所示的逻辑状态号。然后,它在628列出在各种输入的情况下,来源于该状态的所有转换。在629识别具有到该逻辑状态的转换的状态。对逻辑状态表中的每种状态都重复626的文件部分。并且,对每一逻辑状态表都重复在621指定的信息。这向加载器提供用于使硬件加速器个性化的完整信息。由以上描述来看,可以看到,本发明能够优选地以诸如BNF或其派生物的形式记号,直接自动地从语言或功能规范、为任何计算机语言或其它目的提供无差错状态表数据。过程可以迅速地执行,并以低成本产生无差错状态表。从而,本发明允许随意迅速地改变FSM的个性,以适应或提供不同功能、或反映所关心的不同语言或字符串。虽然用单个优选实施例描述了本发明,但是本领域技术人员应该认识到,可以在所附权利要求的精神和范围进行修改来实施本发明。权利要求1.一种以自描述格式提供状态表的方法,所述方法包括以下步骤提供可执行功能的规范,辨别与各个所述可执行功能相对应的标记,将标记变换为确定性有限自动机,以及将所述确定性有限自动机变换为状态表项目。2.根据权利要求1所述的方法,其中,所述变换所述确定性有限自动机的步骤包括形成字符串。3.根据权利要求1所述的方法,包括进一步的步骤在所述可执行功能的规范中检测表示特殊规则的语法实体。4.根据权利要求3所述的方法,其中,所述特殊规则包括“排除”操作。5.根据权利要求3所述的方法,其中,检测到的语法实体是递归的。6.根据权利要求5所述的方法,包括进一步的步骤产生与递归语法实体相对应的一组有限自动机。7.根据权利要求5所述的方法,包括进一步的步骤将递归符号存储在递归符号表中。8.根据权利要求5所述的方法,其中,递归语法实体是定界符符号。9.根据权利要求1所述的方法,其中,所述变换标记的步骤包括进一步的步骤检测与各个所述标记相对应的非确定性有限自动机。10.根据权利要求9所述的方法,其中,所述变换标记的步骤包括进一步的步骤将非确定性有限自动机变换为确定性有限自动机。11.根据权利要求10所述的方法,其中,所述变换非确定性有限自动机的步骤包括进一步的步骤从所述非确定性有限自动机的状态形成闭集。12.根据权利要求5所述的方法,其中,所述变换标记的步骤包括进一步的步骤检测与各个所述标记相对应的非确定性有限自动机。13.根据权利要求12所述的方法,其中,所述变换标记的步骤包括进一步的步骤将非确定性有限自动机变换为确定性有限自动机。14.根据权利要求13所述的方法,其中,所述变换非确定性有限自动机的步骤包括进一步的步骤从所述非确定性有限自动机的状态产生闭集。15.根据权利要求1所述的方法,其包括进一步的步骤优化确定性有限自动机。16.根据权利要求6所述的方法,包括进一步的步骤优化确定性有限自动机。17.根据权利要求10所述的方法,包括进一步步骤优化确定性有限自动机的。18.根据权利要求1所述的方法,其中,所述变换标记和变换确定性有限自动机的步骤是作为单一无分支序列被执行的。19.一种个性编译器,包括用于输入可由数据处理器执行的功能的规范的装置,所述规范包括语法实体,用于从所述规范中的标记来产生有限自动机的装置,包括用于为递归语法实体产生一组有限自动机的装置,用于从非确定性有限自动机的状态来产生闭集,以形成确定性有限自动机的装置,以及用于将所述确定性有限自动机变换为状态表项目,以定义有限状态机的装置。20.根据权利要求19所述的个性编译器,进一步包括加载器,用于将所述状态表项目加载到所述有限状态机中,所述加载器包括用于存储和输出与所述递归语法实体相对应的所述有限自动机集合的堆栈。21.一种硬件语法分析程序加速器,包括有限状态机,加载器,用于将状态表数据加载到所述有限状态机中,以及个性编译器,所述个性编译器包括用于输入可由数据处理器执行的功能的规范的装置,所述规范包括语法实体,用于从所述规范中的标记来产生有限自动机的装置,包括用于为递归语法实体产生一组有限自动机的装置,用于从非确定性有限自动机的状态来产生闭集,以形成确定性有限自动机的装置,以及用于将所述确定性有限自动机变换为状态表项目,以定义有限状态机的装置。22.根据权利要求21所述的硬件语法分析程序加速器,其中,所述加载器包括堆栈,用于存储和输出与所述递归语法实体相对应的所述有限自动机集合。23.根据权利要求21所述的硬件语法分析程序加速器,其中,个性编译器和加载器基本上实时地操作,来改变所述有限状态机的状态表。24.根据权利要求23所述的硬件语法分析程序加速器,其中,所述有限状态机的加载随着时间过去而响应在输入数据流中观测的条件,来适应所述语法分析程序加速器和所述个性编译器。25.根据权利要求21所述的硬件语法分析程序加速器,其中,当所述硬件语法分析程序离线并为有限自动机或状态表形式的结果提供存储,并且所述加载器基于请求方式被操作时,所述个性编译器的一部分被操作。全文摘要一种硬件加速器个性编译器,通过辨别与各个可执行功能、标识、变元、句法、语法规则、特殊符号等相对应的标记,从如在编程语言中以诸如Backus-Naur形式或其派生形式的形式记号提供的一组预期可执行功能的规范、自动地产生无差错状态表。标记可以是递归的(例如无限的),在该情况下标记被变换为确定性有限自动机或非确定性有限自动机。非确定性有限自动机被变换为有限自动机,然后被变换为用于创建状态表的状态转换,然后该状态表能够被存储、或优选地被加载到硬件语法分析程序加速器的有限状态机中,以定义其个性。文档编号G06F9/44GK1781078SQ200380110287公开日2006年5月31日申请日期2003年10月3日优先权日2003年2月28日发明者迈克尔·C·达普,赛·伦·额申请人:洛克希德马丁公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1