没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记253(2010)149-163www.elsevier.com/locate/entcs用于可组合编辑器插件伦纳特角L. Kats,1,2Karl T. Kalleberg+,3 Eelco Visser,1,4代尔夫特理工大学软件技术系荷兰代尔夫特+挪威卑尔根大学医学院摘要现代IDE通过合并许多不同类型的编辑器服务来提高开发人员的生产力。这些可以是纯语法的,如语法高亮、代码折叠和导航大纲;也可以基于语言语义,如内嵌类型错误报告和解析标识符声明。从头开始构建所有这些服务需要广泛了解IDE框架的API和扩展机制(本文介绍了SPOOFAX/IMP,一个元工具套件,它提供了用于描述编辑器的高级域特定语言服务,将编辑器开发人员从许多特定于框架的编程中解放出来。编辑服务是定义为耦合到模块化SDF语法的规则的可组合模块。SGLR解析器提供的可组合性和声明式定义的服务允许嵌入式语言和语言扩展轻松地制定为扩展现有语言定义的附加规则。服务定义用于生成Eclipse编辑器插件。 我们讨论两个例子:一个WebDSL的编辑器插件,一种用于Web应用程序的特定于领域的语言,以及WebDSL在Webslogo中的嵌入,用于表达WebDSL的(静态)语义规则关键词:领域专用语言,集成开发环境,编辑器插件1介绍集成开发环境(IDE)通过提供丰富的用户界面和专用于编辑特定软件语言中的代码的工具支持来提高开发人员的生产力。IDE通过语法突出显示和代码折叠增强可读性,通过交叉引用和大纲视图增强可导航性。现代IDE(如Eclipse)提供了一个可扩展的集成平台,而不是仅为一种特定语言提供广泛的编程环境[1]本研究得到了NWO项目612.063.512,TFA:转换为抽象,和638.001.610,MoDSE:模型驱动的软件演化的支持。2电子邮件:l.c.l. tudelft.nl3电子邮件:karltk@ii.uib.no4电子邮件:visser@acm.org1571-0661 © 2010 Elsevier B.V. 在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2010.08.038150L.C.L. Kats等人理论计算机科学电子笔记253(2010)149使用插件架构的多种语言的语言处理工具。这些平台的可扩展性支持特定语言工具的集成,如编辑器和编译器,以及独立于语言的工具,如版本控制和构建管理系统。尽管IDE平台具有可扩展性,但为新语言实现最先进的支持是一项艰巨的任务,需要广泛了解IDE框架的有时复杂且高度相互依赖的API和扩展机制,并深入了解主题语言的结构和语义流行的Eclipse IDE提供了一个跨平台、高度可扩展的软件平台,对各种语言以及语言独立的实用程序提供了支持Eclipse主要是用Java编写的,它提供了Java语言的顶级Java开发工具(JDT).不幸的是,Eclipse很少有机会重用JDT组件来支持其他语言。此外,由于其规模和广泛的适用性,标准扩展接口和框架相当复杂。有效开发IDE组件的关键是抽象,以消除IDE框架的意外复杂性,模块化,以重用编辑器组件的定义,以及可扩展性,以定制编辑器组件。 在设计抽象以增加表现力时,必须注意避免覆盖范围的禁止性损失,即定制组件方面的灵活性。在考虑语言扩展和嵌入时,重用特别重要,例如在特定领域的语言嵌入[3,1]和具有具体对象语法的元编程[3]等场景中。理想情况下,语言组合是模块化定义的,同样,它们的IDE支持也应该由 IDE对组成语言的支持语言开发环境促进了语言处理工具的高效开发。虽然近年来已经开发了相当数量的语言开发环境[5,7,12,14,15,17,18],但它们对模块化和可重用编辑器定义的支持有限,Monti- Core [14,15]和元环境[17,18]除外。MontiCore通过合并组成语法的结果来提供对语言扩展的一定程度的支持。然而,由于MontiCore的解析器基于LL(k)形式主义,因此扩展共享相同的扫描器。因此,不可能使用不同的词法语法添加扩展。其他扩展可能会导致与现有源代码的不兼容(正如Java 1.5中枚举关键字的引入排除了使用枚举作为标识符的程序,这曾经是有效的Java)。MontiCore还提供了一种替代方法,动态切换到不同的扫描器和代码块解析器,但这仅限于嵌入式。 ded语言相比之下,元环境使用无扫描广义LR(SGLR)解析,它在组合下是封闭的,支持细粒度扩展和嵌入。SGLR已应用于Java、C、PHP以及基于这些语言的嵌入和扩展[3]。元环境具有广泛的工具支持,用于创建、调试和可视化SGLR解析的语法。但是,它只提供了对“标准”编辑器的非常有限的支持L.C.L. Kats等人理论计算机科学电子笔记253(2010)149151程序员期望的服务,例如交互式语法高亮显示、引用重新求解和诸如版本控制之类的实用程序的集成在本文中,我们描述SPOOFAX/IMP,一个系统,集成了基于Java的实现SGLR到Eclipse环境。为了充分应对IDE开发和演变中涉及的复杂性,SPOOFAX/IMP使用了组合编辑器服务描述符(在特定领域语言(DSL)中定义)来指定IDE组件。 DSL为特定类型的语法和语义编辑器服务提供了一个简洁的符号。 由于他们的声明, 描述 符 可 以 组 合 , 支 持 独 立 和 复 合 主 题 语 言 的 模 块 化 定 义 。 从 描 述 符 中 ,SPOOFAX/IMP生成一个Eclipse插件,它可以动态加载到描述符开发所在的同一个工作空间中-确保比启动辅助Eclipse实例的常规方法为了进一步帮助高效的IDE开发,SPOOFAX/IMP自动通过解析语法来导出语言的语法编辑器服务描述符。使用描述符的组合性质,生成的服务描述符可以与手写规范组合,从而自定义故障行为。这种技术允许编辑器的快速原型化,并有助于随着语言的发展而维护编辑器。 当一种语言定义进化时,可以 简单地 重新生 成编辑 器的所 生成的 组件。 我们已 经将这 些技术 应用于WebDSL,这是一种用于Web应用程序开发的成熟的领域特定语言[22,9],它在本文中作为运行示例SPOOFAX/IMP的实现基于IMP框架[5],该框架旨在与不同的解析器和其他工具互操作,使其可用于我们的系统。此外,SPOOFAX/IMP使用了一种语言来描述语言的(静态)语义规则,用于编辑器服务,如交叉引用和错误报告。为了与IMP框架的互操作性,我们应用了程序对象模型适配器(POM)技术的一个变体,以前曾用于集成P2P和开放编译器[10]。为了支持IDE反馈与树转换的结合,我们应用了一种形式的原点跟踪[21],通过调整Applugo本文的组织结构如下。首先,我们描述了编辑器服务的定义,在第2节中讨论了处理语言表示的服务,在第3节中讨论了基于语言语义的服务。在第4节中,我们讨论了编辑器服务的组成。第5节概述了Eclipse和IMP体系结构,以及我们的实现如何增强它。最后,在第6节中,我们讨论了相关的工作,并在第7节中讨论了结论性意见和未来工作的方向。2语法编辑器服务专用于特定语言的编辑器可以提供专门针对该语言定制的源代码演示。在大多数情况下,演示文稿是针对152L.C.L. Kats等人理论计算机科学电子笔记253(2010)149Fig. 1. WebDSL语言的编辑器服务。语法编辑器服务。其中包括语法突出显示、代码折叠和大纲视图。图1展示了WebDSL的这些和其他服务,WebDSL是一种用于Web应用程序的特定于领域的语言[22,9]。语言的语法构成了语法编辑器服务规范的基础。例如,语法高亮可以指定为与语法结果和关键字匹配的规则。在运行时,语法用于解析文件并根据其语法结构应用编辑器服务。我们采用SGLR解析器,并使用模块化语法定义形式主义SDF指定一种语言的语法。 图2显示了SDF定义的一部分WebDSL语言基本的SDF产品采取的形式p1. . . pn->s它指定与符号p1到pn匹配的字符串序列与符号s匹配。可以选择使用自定义名称标记制作,{cons(name)}注释。SDF在一个规范中支持词法和上下文无关的产生式。规范可以组织成模块。语言可以通过导入的方式组成在我们的示例中,WebDSL导入了一个单独的访问控制定义,并重用Hibernate查询语言(HQL)进行嵌入式查询。为了避免符号命名中的任何冲突,HQL语言符号(由其他人定义)在此语法的上下文中使用后缀[[HQL]]重命名。我们在图2中的最后两个产品中使用它来组合这两种语言:HQL表达式可以直接用作WebDSL表达式,而HQL中的WebDSL表达式是用波浪号前缀的L.C.L. Kats等人理论计算机科学电子笔记253(2010)149153模块WebDSL进口WebDSL-Folding WebDSL-Colour WebDSL-FoldingWebDSL-大纲WebDSL-分析WebDSL-引用WebDSL-出现语言描述 和解析名称:WebDSLID:org.strategoxt.imp.generated. website描述:“Spoofax/IMP生成的WebDSL语言编辑器扩展:应用程序表:include/WebDSL.tbl开始符号:开始URL:http://www.webdsl.org/模块WebDSLimports MixHQL[HQL] MixControl.出口上下文无关起始符号开始词汇句法...上下文无关语法“模块”ID部分 *[a-zA-Z][a-zA-Z0-9\_]* -> Id->开始“section”SectionName Def*->Section“define”Mod* Id“{”Element*“}”-> Def{cons(“Module”)}{cons(“Section”)}{cons(“SimpleDef”)}...失效[[HQL]]“~”Exp-> Exp{cons(“ToHQL”)}-> Exp[[HQL]]{cons(“FromHQL”)}图二、WebDSL语言的SDF语法规则图3.第三章。WebDSL的默认主编辑器服务描述符2.1编辑器服务组合主编辑器服务描述符模块导入给定语言的所有服务描述符图3显示了WebDSL语言的主要模块。此模块可以通过指定语言名称、SDF语法和开始生成以及语言的文件扩展名来自动生成。一旦生成,它可以由开发人员定制(在我们的示例中,我们添加了WebDSL网站的地址同样,其他服务的默认文件也会生成并导入到主模块中。每一种服务,例如轮廓,折叠,着色,由其自身的陈述性描述语言定义。所有编辑器服务描述符语言都共享用于构造模块的节标题的概念,例如本例中的语言节。这些指定了所描述的编辑器服务的类型,并且可以选择包含描述文件部分的人类可读文本。由于语法是使用SDF声明性指定的,因此我们可以编程分析其结构。使用一组语法,我们的系统可以为任何给定的语法推导出默认的语法编辑器服务描述符例如,基于图2的语法的树结构,任何Module节点都将显示在大纲中,因为它包含词法字符串和子节点列表。派生规则被放置在明确标记为“生成”的文件中(例如, WebDSL-Cologne.generated),以避免与手写代码混淆。当然,基于一组启发式规则派生编辑器服务永远不会是完美的,并且可能不适合特定的语言或某人尽管如此,派生服务仍然是创建154L.C.L. Kats等人理论计算机科学电子笔记253(2010)149模块WebDSL-Collector.generated//我想...文件...列默认高亮显示规则关键字:“Keywords”=洋红色粗体字符串:“Strings”=蓝色number:“Numbers”=深绿色...色彩系统颜色红色= 128 0 0模块WebDSL-折叠imports WebDSL-Folding.generated折叠添加部分。_ 定义简单定义导入(折叠)见图4。 默认的WebDSL列。图五. WebDSL的折叠规则一个新编辑首先,它们可以构成定制编辑服务的基础。特别是,通过使用编辑器服务组合,可以根据需要重用和定制生成的编辑器服务。其次,他们通过生成的内联文档和显示适用于目标语言的相关示例,2.2语法高亮IDE提供的最基本的,也许也是最重要的编辑器服务之一是语法突出显示。在SPOOFAX/IMP中,语法突出显示基于语言的语法,而不仅仅是关键字列表因此,我们正确地突出显示了仅在组合语法的部分中被认为是关键字的标记(例如from,它在HQL中是关键字,但在WebDSL中不是)。使用语法还使我们能够内联报告语法错误SPOOFAX/IMP基于语法的语法模式派生出一个默认的语法高亮服务图4显示了WebDSL的默认颜色规范(片段)。每个规则都基于词汇标记类型进行匹配,例如然而,由于SDF是无扫描的,词汇标记和产生式被统一处理-它们只是符号。因此,规则也可以在生产或生产类型上匹配。 每个规则指定一个(可选的)人类可读的描述,以在IDE的首选项菜单中显示,以及应应用于匹配节点的默认颜色和格式。对于WebDSL,我们对默认的着色规则非常满意,但希望强调HQL片段中的节和WebDSL表达式。因此,我们将以下规则添加到WebDSL-Cologne模块:颜色定制默认colorbox部分。_:_bolditalic environment_.FromHQL:_italic第一条规则规定,任何Section类型的产品的终端符号都应该是粗体和斜体,并使用描述符中其他地方指定的默认颜色(_第二条规则是环境规则,指定FromHQL节点下的所有节点必须以斜体显示(如图1中的~auhtor[sic])。L.C.L. Kats等人理论计算机科学电子笔记253(2010)149155模块WebDSL-生成//我想...文件...语言默认语法属性line comment:“//”块注释:“/*”*“*/”围栏:[]()的第一个字符。个文件夹|[客户端]|[应用程序-V[H[“application”]_1]_2],部分-V=2 [H[“section”_1]]_2],SimpleDef-- V [ V is=2 [ H [“define”_1 _2“{"]_3]“}”],...]见图6。 WebDSL语法属性。见图7。 WebDSL的漂亮打印规则2.3代码折叠和轮廓显示大纲视图提供了程序的结构概述,并允许快速导航。类似地,代码折叠使用程序的结构来选择性地隐藏代码片段以提高可读性。图5显示了折叠定义的示例。规范导入生成的折叠文件,添加三个新规则。 的 最后一条规则指定默认情况下所有导入声明都应该折叠2.4大括号、注释和源代码大括号匹配和选择注释是通过语法属性服务支持的,如图6所示。遵循IMP框架,这些特性在字符级别实现,因为它们必须操作,而不管格式错误或未关闭的注释和括号。 因此,描述符指定哪些字符串对构成括号,哪些构成注释。代码片段可以使用Box格式化语言进行格式化[20]。Box允许基于嵌套布局框的非常灵活的格式规范。它支持缩进和基于表格的格式。我们将其作为编辑器服务提供,以使用主题语言格式化代码。图7示出了一些示例格式化规则,包括垂直(V)和水平(H)框。这些规则将WebDSL代码格式化为类似于图1中的代码。使用通用的pretty printer软件包[6],它是Applogo/XT工具集[2]的一部分,我们可以从语法中自动派生pretty printer。3语义编辑器服务语义编辑器服务包括突出显示语义错误,为选定的表达式提供类型信息,以及查找标识符的声明。由于这些服务依赖于语义分析,我们的方法旨在最大限度地重用目标语言的编译器提供的任何分析组件WebDSL已使用WEBGO/XT [2]实现,WEBGO/XT是一种程序转换语言和工具集,使用SDF语法进行语法定义。Ringgo转换语言将基于术语的重写与用于指定抽象语法树(AST)上的遍历的策略相结合。树的一阶项表示为一阶项。例如,表示为一个术语,图1中程序的AST是Module (“author” , [Imports (. ), Section(. 、、...... )])。156L.C.L. Kats等人理论计算机科学电子笔记253(2010)149模块WebDSL分析分析提供程序和观察者提供程序webdsl-front.ctree提供程序WebDSL-pretty.pp.afobserver:editor-analyze模块WebDSL-参考引 用 具 有 可 解 析 引 用 的 树 节 点 引 用 Call :function-resolvefunction-inforeferenceFieldAccess:field-resolve field-info...见图8。 语义分析绑定。3.1错误、错误和信息标记图第九章引用解析描述符。我们使用XML规范来表达语义编辑器服务。描述符用于将IDE绑定到JavaScript规范。图8的描述符描述了带有类型检查器的接口。它指定了用于提供语义服务的所有外部组件:编译为WebGo核心语言的WebGo模块(.ctree文件)和WebDSL漂亮打印机(. afles文件)。 它还指定了观察者函数,如果WebDSL文件有任何更改,则会通知该函数。该函数由以下形式的递归规则实现编辑分析:(ast,path,fullpath)->(错误,警告,信息)哪里...这个重写规则被赋予一个带有修改文件的抽象语法树的元组,其项目相对路径和绝对文件系统路径;因此,它可以生成错误、警告和信息标记的列表。例如,对于图1的示例,它返回了一个形式为:([(Var(“auhtor”),“未定义变量auhtor”),.],[]、[])作为第一个元素,错误列表包含一个元组,其中包含拼写错误的“auhtor”变量的错误消息,该变量以树中原始节点的副本的形式包含。 这个简单但有效的接口允许JavaScript函数返回数据和引用抽象语法树的节点。我们将在3.3节讨论这一点的实现。3.2声明和参考资料引用解析是IDE可以找到标识符的声明位置的一个特性,当按住控制键时,可以在Eclipse中作为标识符的超链接访问(参见图1)。 类似地,突出显示出现的所有当光标在其中一个上面时,标识符。图9显示了引用解析描述符。对于 Call或FieldAccess节点,它指定了检索其声明站点的Rumgo规则和用于工具提示的描述(参见图1)。这些规则可以使用标识符到声明的查找表来实现(使用动态规则[2]),类似于[9]中的类型规则3.3实施和工具集成集成IMP、RIGGO和SGLR的主要挑战是让所有工具同时处理同一组数据- AST节点和令牌。 IMP为抽象语法树和词法标记定义标准接口。SGLR和Applugo使用它们自己的术语接口将树表示为术语。SGLR是L.C.L. Kats等人理论计算机科学电子笔记253(2010)149157scannerless:它解析单个字符,不使用tokenizer。传统意义上的代币并不存在。消除这些差异有几种方法。首先,我们使用JSGLR(我们自己的SGLR的Java实现)和JSGgo/J(用Java编写的JSGgo解释器)JSGLR构建的解析树被转换为实现IMP接口的新对象。这个转换从JSGLR解析树创建一个IMP AST,并将解析树中的文字和终端映射到IMP标记。IMP AST节点维护到令牌的链接,令牌进而知道它们的确切源位置。这对于使用树中节点的源位置的编辑器服务(如引用解析或错误标记)来说是必不可少的。为了将IMP AST与Replugo集成,我们采用了程序对象模型(POM)适配器方法的变体[10];我们的IMP AST接口的实现也实现了Replugo重写所需的术语接口程序分析是作为转换实现的,有些转换需要能够构建AST节点作为分析的一部分。这是由POM适配器提供的,它通过AST节点工厂支持节点构造。当Analogo程序转换树时,必须注意不要丢失位置信息。 例如,在WebDSL类型检查器中,标识符被赋予新的、唯一的名称。这意味着每个标识符树节点都被一个新的值替换,其父节点被转换为一组新的子节点。通常,以这种方式替换的树节点会丢失其关联的位置信息。为了避免这种情况,我们对POM工厂设计进行了一些扩展,用于在整个重写过程中处理原点跟踪[21]。工厂现在已经添加了支持基本项遍历操作符one、some和all的方法。原语遍历运算符访问的项的源信息在重写后传播到结果,类似于[21]中所描述的:当重写规则被应用于节点的所有子节点(例如,使用all运算符),旧子节点的起源被传播到新子节点。对于WebDSL类型检查器示例,这种起源跟踪方案确保了尽管类型检查器替换了树中的几个节点,但新节点保持对 原始位置,为编辑器服务提供适当的位置信息。与注释支持一起,起源跟踪已被证明足以在术语重写期间正确传播起源信息4编辑服务编辑器服务的组合需求直接来自于语言嵌入和语言扩展所需的组合。以WebDSL生 成 器 为 例 , 它 是 用 Replego 实 现 的 , 包 含 用 于 模 式 匹 配 和 代 码 生 成 的WebDSL、Java和XML的嵌入片段 [9]。图10的底部窗格显示了这个生成器的一部分,WebDSL代码片段由|[客户端]|用的是西班牙语WebDSL标识符是斜体的,其余的WebDSL代码有黑色背景。SDF提供了一种从模块组成语法的统一机制。这种机制形成了语言扩展和嵌入的基础。当一个158L.C.L. Kats等人理论计算机科学电子笔记253(2010)149metabg白色粗体白色白色斜体深青色环境变量:metabg =210 230 220WebDSL模块imports WebDSL[WebDSL].college为引用的代码片段添加背景颜色environment Term[[go]].ToMetaExpr:_Term[[go]].ToMetaExpr:_环境Term[[go]].FromMetaExpr:_见图10。 用于嵌入WebDSL的列规范(顶部)和组合编辑器实例(底部) 在马达加斯加。给定SDF模块导入另一个模块,它基本上将导入模块的所有语法结果添加到它自己的结果集。允许同一个非终结符的多个产生式;所有的都被保留(这可能会引起歧义,稍后讨论)。在语言嵌入的情况下,苏贞昌(cf. 图2)用于区分嵌入式语言的产生式和宿主语言的产生式。SPOOFAX/IMP反映了SDF的组成机制-图10定义了WebDSL编辑器服务与Applogo 编 辑 器 服 务 的 组 合 。 [11][12][13][14][15][16][17][18][19][19][1 第 一 个collaboration规则为WebDSL代码片段提供深色背景颜色,即对应于ToMetaExpr节点下所有节点的文本都应该着色。第二个规则仅为ToMetaExpr节点正下方的节点设置白色背景。因为这个规则更具体(即,适用于较少的节点),|[客户端]|底部窗格的屏幕截图中的括号具有白色背景,而包含的代码具有深色背景。最后两条规则将白色背景应用于WebDSL片段中的JavaScript着色、折叠和轮廓的规则都是纯声明性的,并且共享相同的组合机制:我们优先考虑具有更具体的模式的规则,以及在规范中稍后定义的规则新定义可以使用_operator 将 属 性 设 置 为 其 他 规 则 中 指 定 的 默 认 值 。 最 后 , 可 以 使 用disableannotation禁用定义。目前,并非编辑器服务的所有方面都是同样可组合的 一些pretty-printer形式主义在composition [ 6 ]下是封闭的,包括我们使用的形式主义。然而,我们目前的DSL并没有暴露这一点。最难组合的服务是那些与语言语义相关的服务:类型检查和引用解析。一个好的语言语义复合形式仍然是一个开放的研究课题。由SPOOFAX/IMP提出的解决方案包括使用Java以相对声明的方式指定类型检查和名称解析规则,以及使用Java利用现有的语言基础设施。L.C.L. Kats等人理论计算机科学电子笔记253(2010)1491595与Eclipse和IMP集成Eclipse架构基于OSGi组件模型,其中每个插件(通常)是一个包含Java类、插件清单、可选的描述文件和辅助资源(如图像)的插件。描述符指定给定插件扩展Eclipse框架的哪些部分,以及插件的哪些部分可以由其他插件扩展IMP [5]用一个高级框架和专门的工具扩展了Eclipse,用于开发对新语言的IDE支持。它由IBM开发,目前用于IBM构建的DSL,如X10并发编程语言。IMP提供了向导,用于根据IMP框架快速生成服务的初始实现。 通常的警告适用:如果向导再次运行,则任何用户自定义都将被覆盖SPOOFAX/IMP使用IMP框架来实现编辑器服务。 作为IMP向导的替代方案,我们提供了更好地处理语言演变和服务组合的DSLs。通过将生成的代码与用户编写的代码明确分离,我们避免了在对不断发展的语言进行更改或派生新服务时对现有自定义进行修改的任何风险虽然IMP在许多编辑器服务中使用了不可组合的访问者,但SPOOFAX/IMP使用DSL对这些访问者进行了抽象。由于语言扩展和嵌入与主题语言一起组成,因此自动提供必要的访问者OSGi模型意味着将插件作为静态JAR分发。 在开发过程中,对插件所做的更改通常不会在活动Eclipse实例中反映出来。为了避免启动新的Eclipse实例来使用新的或更新的编辑器,我们使用编辑器服务的解释来允许将服务动态加载到Eclipse的当前实例中。例如,对于语法突出显示规范,S POOFAX/IMP维护哈希表,指定将哪种格式样式应用于哪种令牌。与单独使用代码生成相比,这种方法可以缩短开发周期。对于部署,仍然会生成插件分发所需的所有文件。动态加载的实现依赖于语言继承的IMP概念语言可以从另一种语言继承服务 如果某个特定的服务对于某种语言不可用,IMP会尝试使用父语言的服务。我们定义了一种新的顶级语言DynamicRoot,所有的S POOFAX/IMP语言都继承了它。 我们的根语言通过提供代理存根来实现标准的IMP扩展点。这些代理根据需要动态加载或更新实际的编辑器服务。例如,语法突出显示服务是由一个类DynamicColombian实现的,它根据需要对适当的具体Colombian类进行编译和更新。向导和DSL可以协同工作。使用语言继承,SPOOFAX/IMP提供的编辑器服务可以被定制的基于Java的服务覆盖。例如,在一个示例中,使用手写大纲视图服务只需要使用IMP大纲视图向导来创建一个覆盖标准DynamicRoot服务的类。160L.C.L. Kats等人理论计算机科学电子笔记253(2010)1496相关工作和讨论关于编辑器的构造和生成有大量的研究,其中很大一部分致力于结构化或语法导向的编辑器。值得注意的早期例子包括程序合成器(PG),一个结构化的程序编辑器,和合成器生成器(SG),一个程序编辑器(程序合成器)的生成器SG和SPOOFAX/IMP都提供了可组合的语言规范,因此支持语言扩展和语言家族。在SG中,语言被定义为具有描述类型规则的属性语法的抽象语法。SG对于获得AST是不可知的,并且没有提供组合具体语言语法的解决方案。PG强加了一种严格的(经典的)语法导向的编辑风格:程序是从用户填充的模板构建的。这种风格确保了程序在语法上的有效性,但从未得到广泛的接受。元环境是一个用于语言开发、源代码分析和源代码转换的框架[17,18]。它包括SDF,ASF术语重写语言,并提供了一个用Java编写的IDE框架.基本语法高亮显示源自SDF语法。着色可以被定制为类似于图10中的环境构造。ASF树遍历也可以用于用着色指令注释AST。ASF还用于指定语言类型规则,并且可能包括自定义错误消息,在类似于图1的窗口中显示。IDE框架提供大纲显示,但不提供折叠或交叉引用。Meta-Environment目前正在集成到Eclipse中。MontiCore [14]和openArchitectureWare [7](oAW)是为DSL生成基于脚本的编辑器插件的工具。两者都提供了类似于EBNF的语法,可以使用继承(MontiCore)或模块导入(oAW)来组合ANTLR解析器是从文法中生成的。在MontiCore中,基本的编辑器表示作为语法属性包含在内。着色被指定为要突出显示的关键字列表支持预定义(Java风格)注释折叠由一个非终结符列表指定。对于语义编辑器服务,Monti-Core语法指定了事件,可以使用用户定义的Java类进行专门化。嵌入式语言在MontiCore中通过语法中的“外部”sym-得到支持继承语法模块可以实现这些外部符号。根据语法分析器的当前状态,通过动态切换到组成语法之一的相应语法分析器和词法分析器来分析组合语法在oAW中,除了解析器之外,还生成EMF [4语言语义表示为对该模型的约束,可以使用类似OCL的语言,也可以使用Java。oAW不支持嵌入式语言。对于SPOOFAX/IMP,我们基于[10]中的POM适配器方法和起源跟踪[21]技术提供了一个到Spoogo的接口来处理语义。SPOOFAX/IMP支持嵌入式语言。虽然MontiCore和oAW中的抽象语法形式都是模化的,但由于采用了不同版本的ANTLR,具体语法受到ANTLR语法合成能力的限制--在MontiCore中为LL(k),在oAW中为LL(*)。GLR解析在组合下是封闭的,允许自由组合对同一事物有多种可能相互矛盾的定义L.C.L. Kats等人理论计算机科学电子笔记253(2010)149161不允许终端。这导致了对GLR解析的普遍批评,即生成的解析树可能包含二义性。 这种批评是有道理的,因为语法中的歧义本质上是不受欢迎的,而且并不总是微不足道的发现,特别是在合成语法中。 使用显式的声明性限制和语法上的优 先 级 排 序 , 这 些 可 以 解 决 [19] 。 其 他 方 法 , 包 括 PEG [8] ,MontiCore中的语言继承,以及ANTLR的复合语法,通过强制对产生式的替代方案进行排序来避免这种情况-第一个(或最后一个)定义覆盖其他定义。隐式排序可能不是语法工程师的意图,并且可能难以调试,因为无法检查丢弃的替代方案。相比之下,GLR方法清晰地显示了这些替代方案。使用解析器单元测试,可以避免由于设计错误、遗漏或回归而导致的歧义。然后,在解析时间之后,当附加上下文信息可用时,立即处理少数剩余的SPOOFAX/IMP使用固定的修剪策略(从任何有歧义的子树中挑选最左边的替代)来处理有歧义的解析树,这允许它与正在开发的语法一起工作直到最近,SGLR的一个缺点是缺乏错误恢复:除了报告解析错误之外,解析器还应该尝试解析文件的剩余部分,以确保编辑器服务的(部分)功能。我们最近解决了这个问题,并做了一个带错误恢复的JSGLR原型实现[11]。7结论和今后的工作提供高质量的IDE支持已经成为一种新编程语言成功的关键。一个坚实的、定制的IDE所需的实现引擎通常是令人望而却步的,特别是对于特定领域的语言、语言扩展和嵌入式语言,这些语言的用户群相对较小。我们已经提出了一个部分解决方案,SPOOFAX/IMP,一个用于快速实现Eclipse编辑器的元工具套件。我们已经展示了几种有助于有效开发IDE支持的技术。首先,我们提供了高级的、声明性的DSL,用于定义在IMP元工具框架上抽象的编辑器服务,并允许通过组合重用以前定义的服务。其次,SPOOFAX/IMP使用语法自动从语法中导出公共编辑器服务,这些服务可以与语法一起适应和共同发展,而没有与修改生成的代码相关的任何麻烦。 第三,我们使用Sparkgo编程语言进行语义分析和编译的高级规范。最后,我们支持将服务动态加载到活动Eclipse环境中,从而缩短了开发周期。一些悬而未决的问题依然存在。我们打算用一个编译器(针对JVM)来取代Replego解释器,以解决性能问题,同时保持由类似地,我们希望优化JSGLR解析器,以便在交互式环境中使用。当前的原型性能很差,理想情况下,它应该支持增量解析。然而,由于它在后台线程中运行,162L.C.L. Kats等人理论计算机科学电子笔记253(2010)149对用户体验影响不大我们以前报道过一个前任,SPOOFAX/IMP[12]. 我们表示,cantly扩展了对语言组合的支持,并增加了对语义分析和在运行时动态加载编辑器服务的支持。在某种程度上,这些变化是由本文简要报告的WebDSL案例研究的经验驱动的。 在以前的其他工作中,我们应用了战略规划在属性语法领域,允许语义分析的高级声明性规范[13]。 在未来,我们希望将这些作为定义的基础-语义编辑器服务。特别是,我们想研究使用这种规范来实现语言扩展的完整语法,语义和工具描述引用[1] M. Bravenboer,E. Dolstra,和E. 维瑟 使用语法嵌入防止注入攻击。 一个主人和客人语言独立的方法。在J. Lawall,编辑,生成式编程和组件工程(GPCE 2007),第3ACM,2007年10月[2] M. Bravenboer,K. T.卡勒贝格河Vermaas和E.维瑟 0.17.语言和工具集for program程序transformation转换. Science of Computer Programming,72(1-2):52-70,June 2008.关于实验软件和工具包的特刊[3] M. Bravenboer和E.维瑟对象的具体语法。特定领域的语言嵌入和同化没有限制。In D. C. Schmidt编辑,OOPSLA 2004,第365-383页。ACM Press,October 2004.[4] F. Budinsky,D. Steinberg,E.梅克斯河Ellersick和T. J·格罗斯Eclipse建模框架。Addison-Wesley,2004年。[5] 查尔斯河M. Fuhrer和S. M.小萨顿IMP:一个用于在Eclipse中创建特定语言IDE的元工具平台。In R. E. K.Stirewalt,A. Egyed和B. Fischer编辑,ASE 2007,第485-488页。ACM,2007年。[6] M.德·容格。适合各种场合的精美打印机。在重症Ferguson,J. Gray,and L. Scott,编者,构建软件工程工具国际研讨会(CoSET 2000),第68-77页。澳大利亚伍伦贡大学,2000年。[7] S. E Eschertinge et al. openArchitectureWare User Guide.版 本 4.3。 可 查 阅 http://www.eclipse。org/gmt/oaw/doc/4.3/html/contents/,2008年4月。[8] B.福特Packrat解析:简单,强大,懒惰,线性时间。2002年ICFP,SIGPLAN通告第37卷,第36ACM,2002年10月[9] Z. 赫 默 尔 湖 C. L. Kats 和 E. 维 瑟 通 过 模 型 转 换 生 成 代 码 。 转 换 模 块 化 的 案 例 研 究 。在 J. Gray , A.Pierantonio和A. Vallecillo,编辑,理论与实践模型转换。第一届国际模型转换会议(ICMT 2008),LNCS第5063卷,第183-198页。Springer,2008年7月[10] K. T. Kalleberg和E.维瑟 将转换语言与开放编译器融合。 以.斯隆和A. Johnstone,编辑,第七次语言描述、工具和应用研讨会(LDTA 2007),ENTCS第203卷,第21Elsevier,2008年4月[11] L. C. L. Kats,M. de Jonge,E. Nilsson-Nyman和E.维瑟在生成的模块化语言环境中提供快速反馈。为无扫描的广义LR 解析添加错误恢复In G.T. Leavens,editor,OOPSLA 2009,ACM SIGPLANNo
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端协作项目:发布猜图游戏功能与待修复事项
- Spring框架REST服务开发实践指南
- ALU课设实现基础与高级运算功能
- 深入了解STK:C++音频信号处理综合工具套件
- 华中科技大学电信学院软件无线电实验资料汇总
- CGSN数据解析与集成验证工具集:Python和Shell脚本
- Java实现的远程视频会议系统开发教程
- Change-OEM: 用Java修改Windows OEM信息与Logo
- cmnd:文本到远程API的桥接平台开发
- 解决BIOS刷写错误28:PRR.exe的应用与效果
- 深度学习对抗攻击库:adversarial_robustness_toolbox 1.10.0
- Win7系统CP2102驱动下载与安装指南
- 深入理解Java中的函数式编程技巧
- GY-906 MLX90614ESF传感器模块温度采集应用资料
- Adversarial Robustness Toolbox 1.15.1 工具包安装教程
- GNU Radio的供应商中立SDR开发包:gr-sdr介绍
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功