没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记110(2004)3-31www.elsevier.com/locate/entcsTXL -一种用于编程语言工具和应用的James R. 科迪1号加拿大金斯顿皇后大学计算机学院摘要TXL是一种专用编程语言,旨在创建,操作和快速原型化语言描述,工具和应用程序。TXL的设计允许明确的程序,语法控制的解释,应用程序,顺序和回溯的分析和重写规则。TXL在较高级别使用一阶函数编程,在较低级别使用术语重写,为遍历、策略、防护、应用范围和参数化上下文提供了灵活的编程。 这种灵活性使TXL用户能够表达并在不改变TXL本身的情况下,尝试解析中的新思想,如健壮、孤岛和敏捷解析,以及重写中的新范例,如XML标记、重写策略和上下文化规则。在本文中,我概述了历史,演变和概念,TXL语言处理工具,重点是什么使它不同于其他语言处理工具,并给出了它的使用在表达和应用最近的新范式在语言处理的例子。保留字:源转换,项重写,文法1什么是TXL?TXL[11,12]是一种编程语言,专门设计用于使用源代码到源代码转换操作和试验编程语言符号和功能。TXL的基本范例包括从现有语言的语法开始,指定语法1电子邮件:cordy@cs.queensu.ca2这项工作得到了加拿大1571-0661 © 2004 Elsevier B. V.根据CC BY-NC-ND许可证开放访问。doi:10.1016/j.entcs.2004.11.0064J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3Fig. 1. 示例TXL程序对语法的修改表示新的语言特征或语言的扩展,并通过源转换到原始语言来快速原型化这些新特征。虽然TXL最初设计用于支持编程语言设计中的实验,但其范式已被证明适用范围更广,并已用于编程语言、软件工程、数据库应用程序、结构化文档、Web技术和人工智能等一系列应用程序中,并用于一系列编程语言,包括C、C++、Java、COBOL、PL/I、RPG、模2,模3,米兰达,欧几里得,图灵和许多其他人。 特别是,它被用作LS/2000分析和补救系统的核心技术,该系统处理了超过45亿行(Gloc)的源代码。TXL程序(图1)通常由三个部分组成,一个上下文无关的2TXL是如何诞生的虽然从表面上看,TXL看起来像许多其他的语言处理系统,但实际上它非常不同,原因有二:首先,它不是基于编译器技术,其次,解析器和Transformer算法都是用户可编程的。TXL在源代码转换系统的评审中经常被误解。有人说TXLJ.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)35语义保护,它不支持属性,它不能访问全局信息,等等。为了了解TXL如何以这些方式被误解,有必要了解它的历史。 与大多数其他语言操作和转换工具相比,TXL有着不同的传统,它的目标在本质上也是不同的。TXL并不起源于解析、术语重写或属性语法技术,而是它的传统是快速原型和一阶函数式编程。TXL诞生于20世纪80年代初,当时编程语言设计的研究是一个活跃和富有成效的对新编程语言和功能的实验是当时的秩序,许多语言,包括C++,Modula 3,Ei Mel,Ada,Perl,Prolog和Miranda都起源于那个时代。其中一种语言是图灵[19]。2.1图灵语言项目图灵项目的目标是设计一种通用语言,具有出色的易用性,轻量级语法和形式化的公理语义,也非常易于访问和学习。图灵的设计受到GeraldWeinberg的计算机编程心理学的“编程作为人类活动”哲学的严重影响。因此,图灵项目采用了“按用途设计”的哲学-当用户在编写他们认为“应该工作”的内容时犯了错误,我们会研究这些错误,以寻找机会使语言更像用户所期望的。这方面的一个例子是图灵中字符串类型从字符串中选择字符的原始语法是简单的下标-例如,如果字符串变量s的值为“hello”,则s(1)选择字符“h”。因为图灵有整数的子范围的概念,例如1. 10、用户自然而然地陷入了写s(1. 4) 得到更长的子字符串,这是添加到语言中的功能图灵使用星号(*)表示参数数组的上限(如数组1..*)int)。因此,用户开始编写s(3..*)表示从位置3到字符串末尾的子串,s(1.. *- 1)表示从第一个位置到倒数第二个位置的子串,s(*-1..*)表示由最后两个字符组成的子字符串,等等。随着这些形式的发展,语言也被修改以适应用户这种实验性的语言设计风格被证明是非常成功的--图灵语言的特性看起来很 用户会通过显示等价性来解释他们的意思-例如,当被问及s(2.. *)对他们来说,他们会说s(2)。长度)。这导致了对意义的一种通过例子的理解-6J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3图二. 一个一种“这就是那”的风格因此,图灵语言的建议通常包括在黑板上画的一对--使用一方面是新特性,另一方面是它在当前语言语法中的相应含义(图2)。使图灵适应这些新想法涉及到重建编译器的每个阶段的重量级过程,以添加每个新功能的词法,语法,语义和代码生成更改。这往往会阻碍实验,使我们过早地投入到我们不确定的功能中2.2图灵机语言理想情况下,我们想要的是让我们能够立即尝试我们在黑板上写的东西-只需通过示例展示我们的想法,然后就可以了!一个快速的原型应该会出现。因此,TXL的想法诞生了--图灵语言,一种通过示例来指定和快速原型化新语言思想和功能的语言正如我们将看到的,这一愿景推动了TXL的所有设计决策及其实现。很明显,这种语言不能基于编译器技术- 我们想要真正的快速原型,没有生成或构建步骤,周期时间以秒为单位这意味着直接的解释性实现,因此我们从Lisp中寻找灵感。特别是,MkMac[22],Lisp的Scheme变体的语言扩展工具,似乎与我们的想法相似。Lisp[26]是一种纯函数式编程语言,基于一个简单的数据结构:嵌套的第一休息(car-cdr)列表。Lisp有一个快速的解释性完全回溯实现,广泛用于人工智能,非常适合快速原型设计。它的实现很好理解,并针对列表处理进行了大量优化。由于这些原因,我们选择Lisp作为J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)37TXL的基本语义模型,使用Lisp列表结构作为其解析树、语法和模式的基础;没有赋值或变量的纯值语义;作为主要控制结构的函数组合;以及对语言的解析器和Transformer方面都具有完全回溯的函数式编程。3TXL语言TXL语言的设计几乎完全由示例快速原型目标驱动在本节中,我们将通过它们所满足的设计目标来介绍基本的TXL语言功能和属性3.1目标:快速成型TXL的Lisp遗产导致了一个类似于Lisp和Prolog中经常使用的解析模型:直接自顶向下的语法函数解释。从目标非终结符[程序]开始,TXL语法被直接解释为递归函数程序,它将输入作为列表来使用终端符号(tokens)。语法的结构被视为两种列表的组合:表示交替的选择列表和表示排序的顺序列表选择列表中的替代形式按照它们在语法中的顺序进行解释,第一个匹配的替代形式被视为成功。列表表示使回溯变得容易:当选择替代或序列元素失败时,我们只需回溯列表中的一个元素以重试先前的元素,直到获得完整的解析解析的结果是以相同的嵌套列表表示形式表示的解析树。这种表示在整个TXL中用于表示语法、解析树、规则、模式和替换,这是TXL如此快速的主要原因之一。理论告诉我们,一个完整的回溯自上而下的解释解析算法处理所有上下文无关的语法。当然,在实践中,对于某些语法,特别是那些具有左递归的语法,这是不实际的。出于这个原因,TXL将左递归定义识别并解释为特殊情况,从而有效地切换到自底向上解释这些产品。尽管如此,仍然有可能编写出一个由于太多的回溯而使用起来很慢或不切实际的TXL语法--这是我们为能够直接解释语法而付出的代价,正如我们将看到的,这在语言的能力和灵活性中起着很大的作用。语法的规范(图3)使用了一个类似于BNF的简单示例表示法,非终结符在方括号中引用(例如,[表达式])和直接表示它们自身的未修饰的终端符号。端子可以使用单个前缀引号进行报价(例如,‘end8J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3图三. 示例TXL语法Lisp,但仅在必要时将它们与TXL关键字区分开来。为了与示例目标保持一致,TXL非终结符定义语句的内容是目标语言的直接无修饰的原始形式因为语法是按照呈现的顺序解释的,所以用户可以完全控制如何解析输入。备选方案是有顺序的,较早的形式优先于较晚的形式。由于语法实际上是一个在用户控制下进行解析的程序,因此没有试图分析或检查语法-任何可以编写的语法都有一些解释。特别是,由于语法现在是一种编程语言,TXL不试图以任何方式限制它,并且非终止解析是程序员的责任。语法中的歧义是允许的,正如我们将看到的,这对TXL范式非常因为语法是以有序的方式解释的,所以解析时歧义的解决是自动的。歧义形式不一定是多余的,因为转换规则可以强制构造语法允许的任何树结构。TXL中的许多高级编程技术都利用了二义性。TXL中内置了几种标准的扩展BNF结构,特别是[opt X],它表示零个或一个非终结符类型[X],[repeat X],表示零个或多个[X]的序列,[listX],表示零个或多个[X]的逗号分隔序列。[repeat X]结构的一个重要属性是它是右递归的,在Lisp的first-rest风格中定义为空或[X]后跟[repeat X]。这符合许多编程中声明和语句的自然解释J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)39见图4。 使用Redefines的语言例如,图灵中声明的作用域是从dec本身到作用域的末尾,由解析器捕获为声明之后的其余语句。TXL语法的朴素的无限制形式对于快速原型化的目标是必不可少的-工作语法可以快速地制作,通常直接从用户级参考手册中,而无需浪费时间解决歧义,解决移位-归约冲突或重构以适应解析器限制。一种新语言的语法可以在不到一天的时间内在TXL中制作和工作,并且创建的解析树可以是语言用户的自然形式,而不是编译器使用的实现语法形式,这使得在制作模式和转换规则时更容易理解和记住形式。3.2目标:语言实验语言实验的主要TXL目标要求我们有某种方法在现有语法中添加新形式和修改旧形式。TXL用语法覆盖的概念来捕捉这个想法。TXL程序通常从基本语法开始,它构成了我们正在试验的原始语言的句法基础然后,通过重写非终结符定义来修改基本语法,以使用语法重新定义来改变或扩展它们的形式(图4)。10J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3Redefines用新的定义替换基础文法中相同名称的现有非终结符定义,从而从旧文法中有效地 重写可以完全替换非终结符的原始定义,或者它们可以使用“.”引用以前的定义。” notation, which is read as “whatit was before” (Figure 例如,重新定义“…| [X]“只是向非终结符添加一个新的替代形式[X],就像向语言添加一个新语句一样。因为TXL定义是按顺序解释的,所以新的表单可以作为预扩展(“[X]|... “)或后扩展(“.| [X]“),对应于前者的新形式优于旧形式,后者的旧形式优于新形式。重新定义是按照它们出现的顺序来解释的,这意味着后来的重新定义可以扩展或修改以前的重新定义,允许方言的方言和以前语言扩展的扩展。有效语法是通过将每个重新定义按照它们在TXL程序中出现的顺序替换到语法中而语法覆盖是TXL区别于大多数其他语言工具的关键思想。它们允许独立探索许多不同的方言和语言的变体,而无需克隆或修改基本语法或其他现有方言。正如我们将看到的,它们还允许敏捷解析--独立修改语法以适应每个特定转换任务的能力3.3目标:范例模式和替换TXL所基于的这意味着需要一种用于转换规则的示例风格,其中模式和替换(后模式)都在目标语言的具体语法中指定,这种风格最近被称为本机模式[32]。在TXL中,模式实际上是我们想要改变的东西和我们应该改变它们的东西的简单形式(示例)(图5)。TXL规则指定了一个要匹配的模式,以及一个要替换它的替换。模式的非终结符类型(目标类型)在模式的开头给出,替换被隐式地约束为相同的类型。模式和替换使用与解析输入相同的语法的直接解释执行来解析,将它们编译成与输入的解析树相同的列表形式的解析树模式。转换规则的执行是通过搜索它们的输入(范围)来寻找与它们的模式树匹配的解析子树,并用它们的替换树的副本来替换它们,该替换树具有复制到结果的模式中捕获的部分。在语法定义、终止符号等模式和替换J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)311图五. TXL范例风格(改编自[10])简单地表示它们自己,并且使用方括号引用非终结符(例如,[表情])。模式非终结符在TXL变量中被“捕获”,方法是用变量名标记它们(例如,Expn [expression])。变量只在第一次出现时显式地类型化,在每次模式匹配时将它们绑定到匹配输入的相应部分。对变量的后续引用其绑定值。绑定变量可以在替换中引用,这允许将匹配的输入的一部分复制到替换的输出中,但它们也可以在绑定的模式或其他后续模式中引用。对绑定变量的引用具有统一语义,也就是说,它们只能通过其绑定子树的精确副本进行匹配(图 6)。出于效率的原因,TXL只提供单向统一,也就是说,模式变量的绑定发生必须是第一次发生。3.4目标:上下文相关的转换和关系源代码转换系统的一个常见困难是控制规则的应用范围。经常出现的情况是,所期望的转换是用诸如12J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3图六、在模式中使用统一规则代替... 或者“这意味着,除了这个之外,我们用...”. 这方面的一个例子是图5的面向对象的图灵语言扩展。在这种变换中,一旦进行了基本替换,就需要应用其他变换,其中一些变换必须限于变换部分内部的范围,而另一些变换必须限于变换部分外部和之后的范围。这种应用范围的限制很难在纯项重写系统中表达,需要对重写规则进行复杂的保护。在TXL中,这样的范围限制自然来自函数范型的分解风格。规则被构造成一个有根的纯函数程序,其中较低级别的规则被应用为由较高级别的模式捕获的子范围的函数。更高级别的规则在其模式变量中捕获子部分,较低级别的规则被显式地应用于子部分,作为其替换的构造的一部分子规则的调用由子规则名称在方括号中表示,方括号中的子规则名称跟随在要应用它的子树的变量的名称之后,例如Thing [changeit],其中changeit是子规则的名称,Thing是包含要应用它的上下文的模式变量。为了与纯函数值语义保持一致,子规则调用的结果是由子规则更改的绑定子树的副本。子规则可以通过在结果上调用另一个子规则来应用于子规则调用的结果,如在X[F][G]中,表示函数组合G(F(X))。这在TXL规则中很常见,允许在复杂的转换中分离关注点。整个TXL转换的语义是将称为main的区别规则应用于整个输入。主规则通常简单地捕获要转换的最高级别结构(通常是整个输入),并在其上调用几个组合子规则来完成实际工作。在复杂的转换中,在子规则中再次使用相同的范例,以此类推,以分解和模块化转换。J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)313见图7。 使用解构的模式3.5目标:复杂的可扩展转换TXL被期望允许任何可能的图灵语言方言或可以想象的扩展的简单快速原型。因此,它被设计为允许用户轻松地对模式和替换进行改进,以便在不失去可读性的情况下扩展到复杂的多阶段转换。因此,解构器和构造器被添加到语言中解构子句约束绑定变量以匹配更详细的模式(图7)。解构器可以是浅的,这意味着它们的模式必须匹配绑定到解构变量的整个结构,也可以是深的,这意味着它们搜索嵌入在项中的匹配项。在任何一种情况下,解构器都充当主模式的保护-如果解构器失败,则整个主模式匹配都被认为失败并搜索新的匹配。替换也可以逐步细化,使用构造子句从几个独立的片段构建结果(图8)。构造函数提供了构建部分结果并将其绑定到新变量的机会,从而允许子规则在替换或后续构造中进一步转换它们。它们还提供了显式命名中间结果的机会,有助于复杂规则的可读性。复杂的转换不仅依赖于它们的应用点,还依赖于远离它的其他上下文的属性。因此,转换规则可能依赖于从许多不同模式捕获的输入的许多部分。TXL允许使用子规则参数来实现这一点,子规则参数与标准函数表示法中的其他函数参数具有相同的作用(图9)。绑定变量可以通过使用符号X[F A B C]将它们添加到子规则调用来传递给TXL子规则,其中14J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3见图8。 使用构造物的替换见图9。 子规则参数A、B和C是子规则F可能依赖的附加约束变量在子规则内部,可以使用解构来模式匹配附加参数,其方式与主模式匹配作用域的方式相同。这允许子规则根据许多不同上下文的属性来限制其应用,并概括转换规则,以处理基于分布在输入.J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3154TXL语言的用户改进为了与图灵项目的面向用户的设计理念保持一致,TXL被允许根据用户反馈进行多年的在本节中,我们简要概述了由于用户使用TXL的经验而产生的一些语言改进。通过这些改进,TXL语言自1995年以来或多或少保持了稳定4.1函数和规则集TXL规则默认使用纯重写系统的固定点组合语义。规则在其作用域中搜索其模式的第一个实例,进行替换以创建一个新的作用域,然后重新搜索下一个实例的结果,依此类推,直到它无法再找到匹配。在大多数情况下,这是源转换的最通用和最合适的语义。然而,随着TXL开始被用于越来越复杂的转换,这种单一规则语义的局限性开始扩大。特别是,对纯函数(仅应用一次)和模块化规则抽象的需求很快就变得明显。这两种需求都通过一个新的功能:函数来满足。TXL函数的行为就像任何其他语言中的函数一样-它们只是匹配它们的参数(即,范围和参数模式),计算结果值(即,换一个),然后停下来。与规则一样,TXL函数也是完全的,如果它们的模式不匹配,那么它们只是返回其未更改的作用域作为结果。随着函数的增加,TXL提供了四种独立的基本转换语义:匹配和转换整个范围一次(函数),在范围内匹配和转换一次(深层函数),匹配和转换整个范围多次(递归函数),以及在范围内匹配和转换搜索多次(规则)。TXL中函数最常见的用途之一是规则抽象,其中一个函数用于收集要应用于一个范围在一起(图10)。在TXL中,这样的函数通常被称为规则集,其语义是将函数应用于作用域会应用规则集中所有规则的组合。函数和规则的组合允许对应用程序和转换规则的范围进行复杂的编程控制4.2显式守卫复杂的转换通常需要对规则的应用进行计算约束,即使范围与其模式匹配。例如,排序16J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3见图10。 规则抽象规则可以匹配序列中的元素对,但是只有当元素的值被乱序时才应该进行转换。一般而言,此类约束可能非常复杂,涉及大量额外计算或从其他来源远程收集的信息为了满足这一需求,TXL中添加了where子句,它可以对绑定到模式变量的项施加任意的附加约束。Where子句使用一种新的特殊类型的TXL规则,称为条件规则。条件规则只有一个模式,通常带有额外的修饰和约束,但没有替换-它们只是成功或失败(即匹配它们的模式和约束,或者不匹配)。许多内置的条件规则提供了基本的语义约束,例如端子符号的数值和文本值组合。图11显示了一个示例赋值向量化规则,它使用一个简单的条件规则来测试表达式是否引用变量。因为条件规则本身就是TXL函数或规则,它们可以使用额外的解构、构造、子规则、where子句等,允许在守卫中进行任意计算,包括涉及全局或外部信息的测试(4.4)。4.3词汇控制正如我们所看到的,TXL最初被设计为只支持一种语言的方言和实验-图灵。出于这个原因,图灵的词法规则最初内置在TXL中。一旦它开始更普遍地用于实现其他语言(如Pascal,C等)的源转换,允许指定其他词法约定的需求就变得清晰起来。因此,TXL中添加了一些功能,以允许指定词汇J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)317见图11。 使用where的受保护规则关键字(保留标识符)、复合词(将多字符序列视为一个单元)、注释(注释约定的指定)以及最常见的标记、任意字符序列的正则表达式模式等方面的规则像非终结符定义一样,token定义可能是模糊的,并且按照它们被指定的顺序进行解释,前面的模式优先于后面的模式。此外,TXL中还添加了一个字符模式,允许对原始输入进行无扫描解析,无论是按字符、行还是按字符类(例如,字母、数字、空格等)。4.4全局变量和表也许TXL语言中最广泛的用户添加是全局变量。许多转换任务最方便的表示是使用某种符号表来收集信息,然后在实现转换规则时将其用作参考。在纯函数式语言中实现符号表是有问题的,涉及到在深度递归的“连续传递”规则调用风格中显式地传递结构作为附加参数为了让TXL更容易地处理这类转换,并避免与额外的规则参数和复杂的保护相关的开销和不合理性,添加了全局变量。TXL全局对象是根据Linda黑板式的消息传递建模的[18]。在这种风格中,绑定的局部变量通过规则或函数导出到全局作用域,以便稍后通过其他规则或函数导入。导出的变量可以是任何非终结符类型,包括与主语法无关的新类型,并且当变量在另一个规则中导入时,它必须是相同的类型。18J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3图12个。TXL中的全局表TXL全局变量在转换中有很多用途,但最常见的是最初的用途:符号表。TXL中的符号表通常被构造为由(键,信息)对序列组成的关联查找表。键和信息都可以是任何非终结符类型,包括专门为此目的定义的新类型。通常键的类型是[id](即,识别器)。TXL解构用于关联地查找给定键的信息(图12)。因为它们使用模式匹配,所以表查找也是双向的;如果想知道与某些信息相关联的键,解构器也可以很容易地以这种方式进行模式匹配。通过添加函数、保护、词法控制和全局变量,TXL语言基本上是完整的-一种用于编程源转换的通用语言。在本文的其余部分中,我们通过展示TXL如何能够表达语言处理,源代码分析和源代码转换中的新思想来证明这种普遍性。5在TXL中表达新范式由于其完全可编程的特性,TXL用户可以直接尝试源代码操作中的新思想和范例,而无需更改TXL或其实现。解释型解析器意味着这既适用于转换,也适用于解析中的新思想。在本节中,我们将讨论一些最近流行的语法、解析和转换方面的新思想,以及它们在TXL中的实现J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3195.1鲁棒解析近年来,源代码分析和操纵技术已被广泛应用于以Cobol、PL/I和RPG等语言编写的大型遗留系统。这些语言的一个困难是,由于方言、变体、预处理器和局部增强的广泛范围,它们具有解析的挑战性。分析工具经常会因为这些查询的解析错误而失败。在大多数情况下,这样的差异是次要的,主要的问题只是给出一个解析。鲁棒解析[2]是一种自动提供即使在存在无法解释的输入部分的情况下也能完成解析的方法。鲁棒解析的原始方法涉及定制的LL(1)算法,通过替换或忽略输入的最小部分来纠正输入中的语法错误,以继续解析。例如,当遇到无法识别形式的语句时,该方法可能只是忽略语句中的输入符号,直到下一个符号或其他结束标记。语法覆盖允许TXL用户直接编程健壮的解析,而无需对TXL解析器进行任何更改。例如,我们可以扩展语句的非终结符定义,以包括一个额外的未解释的case,它接受任何东西,直到下一个语句结束标记(图13)。这种解决方案利用了语法的直接解释的两个属性:有序替代(因为它是最后一个替代,所以除非没有其他语句形式可以匹配,否则永远不会使用未解释的情况)和歧义(因为未解释的情况对于所有其他声明形式)。5.2岛屿语法岛语法[17,27]是从自然语言处理中借用的相关概念。当我们只对输入的一部分感兴趣时,岛语法允许对非常大的输入进行健壮、高效的半解析。 岛语法用于在一个不感兴趣的输入流(水)中只挑选和解析感兴趣的项(岛)这个想法被扩展到多个层次,其中岛可能包含未解释的湖,而这些湖又可能包含更小的岛,等等。当我们只对复杂输入的一个方面感兴趣时,岛解析特别有用,例如,如果我们只对处理HTML网页的嵌入式ASP方面感兴趣,或者如果我们只对Cobol程序的嵌入式SQL方面感兴趣岛语法可以直接在TXL中编码,也可以作为岛嵌入的基础语言的方言。图14显示了一个TXL语法,它使用岛语法处理Cobol中的嵌入式SQL20J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3图十三. TXL中的鲁棒解析示例程序作为未解释的湖泊(SQL代码)包含有趣的岛屿(SQL引用Cobol主机变量)。这种语法的关键特征是非终结符修饰符not。TXL表达式[not end exec]告诉解析器,下面的语法形式不能与非终结符[end exec]匹配的标记序列匹配。[not]本质上是一种先行检查;它不消耗任何输入。这可以防止解析器错误地使用非SQL标记。在岛屿语法术语中,这可以被认为是防止湖泊消耗海岸线的防波堤。5.3联合文法由于对“遗留语言”和向万维网迁移的关注与设计TXL的语言扩展任务不同,这需要处理两种而不是一种语言语法的转换--源语言和目标语言。此外,由于TXL规则被限制为同态(语法类型保持),因此TXL如何服务于这种多语法任务并不明显。一种解决方案是联合语法,它在适合于自然翻译水平的“交汇”点(例如过程、语句和表达式)混合两种语言的非终结符在联合文法中,[statement]非终结符允许输入语言语句形式和输出目标语言语句形式,输入的解析被约束为前者,结果输出被约束为J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)321图十四岁Cobol中嵌入式SQL的孤岛语法(改编自[16])后者联合语法可以被编码为TXL语法覆盖,例如通过重新定义[语句]非终结符,首先列出输入语言替代,然后列出输出语言替代。因为语法是以有序的方式直接解释的,所以输入的解析将作为输入语言语句,即使输出语言语句是模糊相似的。然而,由于非终结符[statement]允许输入和输出语言形式,语句转换规则可以在两者之间自由移动。图15显示了使用这种技术从Pascal到C的语言翻译的一部分5.4敏捷解析敏捷解析[16]指的是覆盖基本语法以提供更适合或更方便每个应用程序的解析的想法。这种思想可以通过使用自定义语法从根本上简化软件分析和转换任务,该语法将输入的解析结构化为手头任务的理想形式,而不是语言的通常标准形式图16显示了一个非常简单的示例,它使用敏捷解析来识别和隔离Java程序的JDBC(数据库)方面,方法是覆盖语法,以便将JDBC方法调用与其他方法调用区分开来进行分类和解析。同样,该解决方案利用TXL中对歧义的可编程处理来修改任务的语法。 使用解析器的强大功能识别感兴趣的项目并将其抽象为自定义语法类别-22J.R. Cordy/Electronic Notes in Theoretical Computer Science 110(2004)3图十五岁Pascal和C的联合语法的一部分(改编自[16])图16. 使用敏捷解析为任务定制语法(改编自[16])Gories可以显著降低分析规则的成本和复杂性。5.5解析树注释解析树注释[30]是最近获得新关注的一个想法在软件再工程社区[23]。的挑战是提供在解析树中添加、保存和操作复杂注释的能力,
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功