没有合适的资源?快使用搜索试试~ 我知道了~
97理论计算机科学电子笔记65 No.3(2002)网址:http://www.elsevier.nl/locate/entcs/volume65.html20页面向方面和XML的语义框架生成器SmartToolsDidier Parigot,Carine Courbis,Pascal Degenne,AlexandreFau Claude Pasquier,Joël Fillon,Christophe Held,IsabelleAttaliINRIA Sophia-Antipolis-OASIS项目,2004年,Route des Lucioles - BP 9306902 Sophia-Antipolis cedex,FranceFirst. sophia.inria.fr摘要SmartTools是一个基于XML和对象技术的语义框架生成器。由于从规范自动生成的过程,SmartTools可以快速开发专用于特定领域和编程语言的环境。其中一些规范(XML、DTD、Schemas、XML)是由W3C发布的智能工具使用对象技术,如访问者模式和面向方面编程。它提供了适合于使用这些技术的代码生成,以支持语义分析的定义。通过这种方式,我们以最小的成本获得了一个模块化开发平台的设计和实现,该平台是开放的,交互式的,统一的,最重要的是易于演变。关键词:软件生成,开发环境,语义分析,面向方面编程,访问者模式,程序转换,XML,XML。1介绍随着与互联网应用的数据处理相关的新技术,语言的概念越来越多地用于结构化信息。因此,万维网联盟(W3C)引入了新的形式主义,如DTD(数据类型定义)或模式,推广了抽象语法的概念此外,软件质量和开发速度是这一特定应用领域的主要关注点。这证明了创建一个强烈基于XML(可扩展标记语言)和对象技术的软件生成器,名为SmartTools。这个软件生成器的主要目标是帮助特定领域或编程语言的设计者不超过一个规格(例如:DTD)c 2002年由Elsevier Science B出版。V.CC BY-NC-ND许可下的开放访问。SmartTools98快速创建专用开发环境。目标环境和SmartTools框架都必须满足以下要求:易于以最少的知识使用并且基于公知的技术或标准规范,基于可重用和通用组件,以及基于分布式软件体系结构的模块化和灵活的实现,由于图形用户界面(GUI)提供了多视图和交互式环境,由于采用了标准数据交换格式,可与其组件和其他外部应用程序进行通信,因此具有开放性。为了简化语义分析的开发,SmartTools中引入了几种技术。首先,访问者设计模式[9]的解决方案在很大程度上是自动化的,从抽象语法定义生成Java源代码。第二,加入面向方面的编程,以获得更多可重用的语义组件。这个新功能不需要任何程序转换。因此,在访问者上添加方面可以是完全动态的(无需重新编译)。第2节介绍了这些语义工具。为了满足架构要求,模块化软件架构是围绕一个中央软件组件构建的:消息控制器。SmartTools由几个独立的软件组件组成,这些组件通过交换异步消息相互通信。XML技术被用来对这些消息进行编码。第3节介绍了SmartTools的模块化架构。关于交互式需求,SmartTools具有可扩展的模块化GUI,带有一组基于XML技术的漂亮打印机或查看器。对于数据集成和向新的应用领域开放,XML格式用于组件之间的所有数据交换,并作为新应用程序的描述语言。第4节介绍了这些互动功能。关于可重用性要求,SmartTools使用并提供了几种先进的软件技术,这些技术源于各种研究工作[2,4,11,12,16,23],但都是同类技术。事实上,Web应用程序的出现XML技术的广泛应用和新的应用领域是该软件生成器的资产2语义工具在内部,SmartTools为所有工具使用扩展的强类型抽象语法(AST)这些定义的重要概念是:操作符和类型。运算符被聚集到命名的集合中:类型。运算符的子运算符被类型化并命名。图1显示了我们的玩具语言的定义:tiny1。例如,affect运算符属于Statement类型,并有两个儿子:1在这篇文章中一直使用SmartTools99形式主义的微小是根是%顶;Top =program(Decls declarationList,Statements语句);Decls = decls(Decl[] declationList);Decl = intDecl(Var变量),booleanDecl(Var变量); Statements= statements(Statement[] statementList); Statement =affect(Var变量,Exp值),while(ConditionExp cond,Statementsstatements),if(ConditionExp cond,StatementsstatementsThen,StatementsstatementsElse); ConditionOp = equal(ArithmeticExp left,ArithmeticExp right),NotEqual(ArithmeticExp left,ArithmeticExpright); ConditionExp = %ConditionOp,true(),false(),var;ArithmeticOp = plus(ArithmeticExp left,ArithmeticExp right),minus(ArithmeticExp left,ArithmeticExpright),mult(ArithmeticExp left,ArithmeticExpright),div(ArithmeticExp left,ArithmeticExp端org.w3c.dom.ElementDomSmartTo微小+getVariableNode():tiny.ast.VarType+setVariableNode(tree:tiny.ast.VarType):void+getValueNode():tiny.ast.ExpType+setValueNode(tree:tiny.ast.ExpType):voidtiny.ast.AffectNodeImpltiny.ast.AffectNodetiny.ast.StatementTypefr.smarttools.tree.FixedNodeImplOLSfr.smarttools.tree.FixedNodefr.smarttools.tree.UntypedNodeImplfr.smarttools.tree.UntypedNodeorg.apache.xerces.dom.ElementImpl第一个是Var类型,第二个是Exp类型Fig. 1. AST对微小的从任何AST定义,SmartTools可以自动生成特定于该语言的结构化编辑器。为了便于编辑(复制-粘贴节点),使类型包含2成为可能是有用的。我们希望尽可能多地使用源自W3C标准的现有软件组件,如DOM(文档对象模型)API来处理XML文档。但是,后一种API不考虑强类型结构。为了操作强类型树,我们已经扩展了它的概念,固定节点,列出节点和类型节点(c.f.图2)。通过这种方式,树的一致性由Java类型检查器在其构造时保证。对于每个操作符,SmartTools自动生成一个类和关联的接口(图3显示了为影响操作符生成的接口),以及按类型生成的一个接口。这些类包含处理子类所需的getter和setter(例如getValueNode、setValueNode)。图二.影响运算符2在图1中用%符号标记SmartTools100affect(Var变量,Exp值)with attributes {fixed String S1 =“=",fixed String styleS1 =“kw”,fixed String AO =“;",fixedString styleAO =“kw”}package tiny.ast;public interfaces AffectNode extends StatementType{ public tiny.ast.VarType getVariableNode();public void setVariableNode(tiny.ast.VarTypetree); public tiny.ast.ExpType getValueNode();public void setValueNode(tiny.ast.ExpType tree);}图三.生成的影响操作符接口:AffectNode重要的是,语言设计者可以通过使用W3C提出的标准格式(DTD或Schema)来定义他们的语言(抽象语法),而不必使用SmartTools的内部AST定义格式。因此,我们在实现转换工具时有一些限制。例如,类型的概念并不显式地存在于DTD格式中,即元素(被视为操作符)不属于命名集。由于这个概念是必不可少的,我们必须定义一个类型推断机制来转换DTD。此外,元素定义的右边部分应该只包含参数实体引用,以指示子元素的类型(例如,图4的第6行显示了影响操作符的DTD等效定义)。不幸的是,很少有DTD是这样写的为了能够接受尽可能多的DTD,执行了更复杂的类型分析(类型推断)。123456见图4。生成的tiny的此外,我们还实现了生成器,它可以生成一个解析器和一个关联的漂亮打印机,以便使用比XML格式更可读的格式来操作程序。为此,设计者必须提供关于每个元素(或操作符)定义的额外属性信息(参见图5中的属性)。这种可能性对于那些不具备如何编写解析器的专业知识的设计人员非常有用,并且只对小型和明确的语言有意义。图五. affect运算符的额外数据,用于生成解析器和相关的pretty-printer图6显示了可以从AST规范生成的所有规范:语言的API(即,一个类和相关的接口按操作符,一个接口按类型),<!ENTITY % Top<!ENTITY % Statements<!ENTITY %语句'if|而|影响'><!ELEMENT程序((%Decls;),(%Statements;))><!ELEMENT语句(%Statement;)*><!元素影响((%Var;),(%Exp;))>SmartTools101解析器生成器tiny.gAntlr进口API发生器漂亮的打印机发生器tiny.xpp资源生成器tiny.xml访客生成器DTD或架构生成器TypeChecker.xprotiny.asttiny.dtd或tiny.xsdTiny的APIAffectNode.javaAffectNodeImpl.javaStatementType.java...AbstractTypeCheckerTinyVisitor.javaTraversalTypeCheckerTinyVisitor.javatiny.xsdtiny.dtdAbstractTinyVisitor.javaTraversalTinyVisitor.javaTinyParser.javaTinyLexer.javawww.example.comTinyParserTokenTypes.java用于创建语义分析的基本访问器,语言的解析器(如果在语言定义中提供额外的语法糖作为运算符属性),一个漂亮的打印机来根据这些额外的语法糖解析AST,一个包含结构化编辑器和解析器的有用信息的最小资源文件,DTD或Schema。见图6。从AST例如,多亏了这些工具生成器,微型环境只从一个AST规范(参见图1第3页)、一个xprofile规范(参见图7)和类型检查器访问器(100行Java代码)自动生成。语义本小节介绍了使用访问者设计模式编写程序分析(例如类型检查器,求值器或编译器)的方法。如果读者想对这个著名的方法学有更多的细节和解释,他可以参考[9,21,22]。例如,我们提出了三个扩展的访问者模式技术:v1使用自反机制与轮廓的访问和树遍历的可能性,v2添加简单的面向方面的编程,v3分裂的树遍历(访问方法调用)和语义动作,通过使用更复杂的方面。自反性访客(v1)为了使基于AST定义的访问者的开发更容易,Smart- Tools自动生成两个访问者类:AbstractVisitor和TraversalVisitor。抽象访问者声明了所有的访问方法(一个通过操作符)。TraversalVisitor继承自AbstractVisitor,并实现了所有的访问方法,以执行深度优先的树遍历。这个访问器可以被扩展,它的访问方法可以被细化(覆盖)以指定一个分析。SmartTools102XProfile类型形式主义微小;导入tiny.visitors.TinyEnv;配置文件对象检查(%Top,TinyEnv env);对象检查(%Decls,TinyEnv env);对象检查(%Decl,TinyEnv env);对象检查(%Statements,TinyEnv env);对象检查(%Statement,TinyEnv env);字符串检查(%Exp,TinyEnvenv);字符串检查(%ArithmeticOp,TinyEnv env);字符串检查(%ConditionOp,TinyEnv env);字符串检查(%ArithmeticExp,TinyEnv env);字符串检查(%ConditionExp,TinyEnv env);字符串检查(%Var,TinyEnv env);城市战略;由于SmartTools的xprofile规范语言,可以指定访问签名,即生成具有不同名称、返回类型和参数的访问这种个性化的粒度是在(AST)类型级别。图7展示了tiny的类型检查器的xprofile规范。根据这个规范,系统自动生成两个正确类型的访问者(AbstractVisitor和TraversalVisitor)。只有有用的visit方法才必须被重写以实现类型检查器(请参见图8中的affect操作符)。使用分析访问的优点是避免强制转换并获得更可读的访问者程序。见图7。访问微小12酒吧String varName = node.getVariableNode().getValue();3String getType();4String typeRight = check(node.getValueNode(),env); //访问值节点56if(i = null)7errors.setError(node,“此变量“+ varName +“未声明”);8否则{9如果(!typeRight.equals(TinyEnv.ERROR)(!typeLeft.equals(typeRight)10setError(node,“不兼容的类型:“+ varName +“是一个”+11typeLeft.equals(TinyEnv.INT)?“int”:“bool”)+”variable”);12}13返回null;14}见图8。类型检查器的影响访问使用xprofile语言,还可以指定访问者的树遍历(从起始节点到目的节点)因此,只有路径上的节点它减少了访问者在相当大的树上的运行时间,最重要的是减少了生成的访问者的大小。对AST定义进行依赖图分析,根据给定的路径生成相应的具有“正确”访问的抽象访问者和遍历例如,对于图9中指定的遍历,只有while和affect操作符的访问以及包含在根(TOP)和这些操作符之间的操作符的访问(即,根据图1第3页的AST定义的程序、语句和if)将被调用。在SmartTools中,我们使用Java自反机制来实现访问者技术,而不是特定方法的经典解决方案,通常表示为SmartTools103+visit(node:Node,params:Object):Object #invokeVisit(params:Object[]):Object+addAspect(aspect:Aspect):void+removeAspect(aspect:Aspect):void+ addApacheOnOperator(op:Operator,aspect:Aspect):void+ removeAspect OnOperator(op:Operator,aspect:Aspect):void+ addAspect OnType(type:Type,aspect:Aspect):void+ removeAspect OnType(type:Type,aspect:Aspect):void访问者导入试验:%Top -> while,影响;图9.第九条。从根(TOP)到while和affect的Traffic接受,定义在每个操作符3上。实际上,引入访问者配置文件禁止使用这种经典的解决方案(接受方法)。当调用任何访问方法时,都会执行一个泛型方法这个泛型方法的目标是通过使用自反性来调用“正确的”访问方法(使用强类型节点)。反身性的使用在运行时开销很大。为了加速调用过程,当生成抽象访问者时,在编译时静态地生成一个间接表这个表包含了每个对(操作符,类型)的Java引用,这些引用指向要调用的visitjava.lang.reflect.Method对象。使用此表,还可以更改访问方法名称并使用不同的参数。该解决方案是多方法方法的简化,该方法动态地执行对要应用的最佳方法的搜索。我们通过使用Java多方法实现比较了这两种方法[8]。性能相当,但我们的方法更容易实现。有视角的访客(v2)用于实现访问者模式技术的自反性机制使得在访问调用之前或之后执行附加代码成为可能。通过这种方式,可以在不修改源代码的情况下添加特定于我们的访问者的面向方面编程的概念[13,15],这与ANOJ的第一个版本不同[1,14]。一个方面可以通过实现Aspect接口来定义,然后记录在任何访问者上(参见图10中的方法例如,如果图11的方面记录在一个访问者上,它将跟踪所有调用的访问。见图10。使用aspect(v2)API的几个方面可以连接到一个访问者。它们按顺序执行(根据注册顺序)。这种连接(以及断开连接)可以在运行时完成因此,访问者的行为可以通过添加或撤销这些方面来动态修改例如,为访问者指定了一个图形调试模式,并将其作为一个方面,3SmartTools还可以帮助设计师开发这种高效的访问者。但是,它们的代码比v1或v2访问者的代码可读性更差(更多的类型转换,没有方面,没有树遍历选择等)。因此,我们不在本文中描述它们。SmartTools104软件包fr.smarttools.debug;import fr.smarttools.tree.visitorpattern.Aspect;import fr.smarttools.tree.Type;public class String { public void previously(Type t,Object[] param){System.out.println(“开始访问时间“+param[0].getClass());}public int findDuplicate(int [] nums){System.out.println(“结束访问时间“+param[0].getClass());}}见图11。考察方法任何访客。为了在v1访问者上添加这些方面,扩展了泛型方法(invoke-Visit)访问者与树traffic和复杂的方面(v3)有了面向方面编程的概念,就有可能将树遍历(访问方法调用)和语义处理(语义操作)分开。让我们假设affect(Var,Exp)运算符的访问代码具有以下形状:visit(AffectNode节点.){ codeBefore第一个儿子的访问codeBetween1_2第二个儿子的访问代码之后}可以观察到语义部分(即除了递归调用之外的所有部分)是被分成N个儿子+1段代码。这些N+1个片段可以被视为具有新锚定点的方面,即在子访问方法调用之前、之间和之后 我们定义了一个新的访问者(名为v3 visitor),它接受树遍历和一个或多个语义动作(即方面的形式)作为参数,如图12所示。这个访问者可以在这些新的锚定点上调用这些相位。因此,这些方面对于每个操作符,除了传统的before和after方法之外,还必须具有betweeni_i+1方法(在第i个和第i+1个子之间执行的代码)。这个新的访问者可以连接v2访问者中描述的一个或多个图13显示了与使用这种新形式的方面的影响操作符相与v1(参见图8第6页第4行)或v2访问器不同,没有更多的递归调用,但必须使用堆栈(参见图13第5行和第6行)来传输儿子的访问结果。tiny的类型检查器仅通过组合这两个方面(参见图15)来扩展变量的初始化检查(参见图14)。这种编程风格的主要目的是使分析的扩展成为可能,而无需通过添加新的方面进行修改通过这种方式,分析是模块化和可重用的。然而,由于语义和树遍历的分离,这些分析的编程更加复杂(比较图13和图8)。目前,我们研究如何在语义之间共享数据,问题联系到常见的树遍历(例如,如果一个语义想在一个节点上循环而不是其他语义,该怎么办;我们还研究了简化这些SmartTools105VisitorAspectpublic void before(AffectNode node,Object param){unplugVariableCheck = true;}public void visit1(AffectNode node,Object param){unplugVariableCheck = false;}public void after(AffectNode node,Object param){int n = next.getVariableNode();}System. out. println(); System. out.InitVarbrowkerVisitor initVarCheck = new InitVarbrowkerVisitor(env);new Visitor(new LeftToRightTreeTraffic(),new Semantics[]{typeCheck,initVarCheck}).start(tree,null);TreeTraffic之前,之后,之间当前,访问,之前,之后忽略、向后、向前、跳转到忽略、向后、向前、跳转到+current():void+visit():Object+invokeVisit():Object+backward():void+forward():void+ignore():void+jumpTo():void+between():Object+before():void+after():void+addAspect():void+removeAspect():void+ addAblockOnOperator():void+ addAblueOnType():void见图12。v3访客123public void before(AffectNode node,Object param){}public void between1_2(AffectNode node,Object param){}public void onDestinyNode(){4String varName = node.getVariableNode().getValue();5String sort =(String)sort.pop();6String sort =(String)sort. sort();78如果代码与图8相同(第6行到第12行)9}图十三.影响运算符图14.检查影响操作符(v3访问者)图15.两个方面隐藏堆栈管理。对于v3访问者(参见图12),还有一个通用方法,它根据当前位置、树遍历和一些特殊的遍历指令来管理要访问的下一个节点。这个方法还处理下一个要调用的方法的搜索以及这些访问中v2方面的调用。+ transverse(node:Node):void+backward():void+forward():void+ignore():void+jumpTo():void语义1+before():Object+after():Object+betweenN_M():ObjectSemanticN+after():Object+before():Object+betweenN_M():ObjectSmartTools106文献1视图1/文档1文献2文档GI图形界面(View/DocIG)视图2/文档1视图1/文档2消息控制器Document Manager解析器管理器基地3架构SmartTools由独立的软件模块组成,这些模块通过交换异步消息相互通信。这些消息是类型化的,可以被认为是事件。每个模块都在一个中央软件组件上注册自己,即消息控制器(参见图16),以监听某些特定类型的消息。它可以通过发布新消息来对它们做出反应控制器负责管理消息流并将其传递到特定目的地。因此SmartTools的组件是事件驱动的。本节介绍SmartTools的不同模块并描述消息控制器的行为图16. SmartTools的架构SmartTools的主要软件模块如下:每个文档都包含一个AST。在图16中,文档1和文档2包含用户正在处理的ASTGI文件是一个特殊的文件。它包含描述GUI结构的AST(例如,第15页图23的AST)。用户界面模块管理SmartTools的视图、菜单和工具栏。每个视图都是一个独立的模块,以取决于视图类型的格式显示文档的内容。例如,某些视图以彩色语法文本格式显示树,而其他视图则以图形表示形式显示树。解析器管理器为文件选择正确的解析器。然后,它运行解析器并构建相应的AST。文档管理器使用此树构建文档模块并将其连接到消息控制器。基础是一个包含SmartTools中使用的资源定义的模块:颜色、样式、字体、菜单、字体、操作等。当然,新类型的模块可以在消息控制器上注册自己这是为特定目的扩展SmartTools功能或将SmartTools嵌入其他环境的方法之一当一个模块需要与另一个模块通信时,它会创建一个消息并将其发布到消息控制器上。然后,消息控制器将此消息广播给相应的侦听器(模块),这些侦听器将对其做出反应因此,mod-SmartTools107想要从消息控制器接收特殊类型消息的用户必须成为这些类型消息的监听器。它们必须实现MsgMessage接口,并为每种支持的消息类型提供一个receive(xxxMsg)方法。然后,它们必须在消息控制器上注册(参见下面的代码),并从中获得其唯一的模块标识符。document. writeln(this);receive方法中的XxxMsg代表预期消息的类。消息是类型化的对象,即每种类型的消息都有一个特定的类。它们的共同行为保存在一个抽象类中,这个抽象类是所有消息的超类可以通过扩展该公共类或任何其他现有的消息类来创建新类型的消息。在下面的示例中,模块期望接收发送到由idDoc标识的模块并且来自匿名发件人的SelectMsg、Close- DocMsg和CutMsg消息msgController. addMsgController(“SelectMsg”,idDoc,Msg.ANONYMOUS); msgController.addMsgController(“CloseDocMsg”,idDoc,Msg.ANONYMOUS); msgController. addMsgController(“CutMsg”,idDoc,Msg.ANONYMOUS);文档(即AST)和视图在消息控制器上独立注册。一个文档不需要知道有多少视图与它相关。当一个修改被做出时,文档发布一个修改消息。该消息的类型指示已完成的修改,消息体包含修改的节点的路径(从树根开始)。对于某些类型的消息,还指定了更改这样的消息将只发送到注册为接收来自此文档的这些修改消息的视图。其他模块不会接收它们。消息控制器具有内置的消息过滤功能。可以编写过滤器来监视或影响控制器上的输入和输出消息流。这种过滤功能已经成功地用于几种特定的需求:基准测试、调试、撤消用户操作,以及自动将消息转换为另一种格式(SOAP消息)。SmartTools的体系结构旨在简化与其他开发环境或工具的连接一些实验[24]正在进行中,以将SmartTools的几个功能作为Web服务提供,并在.NET平台上运行的客户端工具中使用它们。4图形用户界面SmartTools具有基于文档/视图概念的GUI(参见图17),即用户界面是可以显示和操作文档(AST)上的视图的框架。对于每个打开的文档,可以构建和显示一个或多个视图,根据不同的格式显示树的不同方面。XML技术被广泛用于构建这个GUI和不同的视图。通过对文档的AST应用转换来构建文档上的视图我们SmartTools108图17.图形用户界面已经尝试了两种不同的方法来执行树转换和构建图形视图。第一种方法是编写一个访问者来转换树并直接构建图形组件的层次结构。这是快速和有效的,但需要重新编译每一次的变化是在transform-mation。第二种技术是使用XML指定树转换,以生成要创建的图形组件的BML(Bean MarkupLanguage)描述。然后解释BML结果(参见图18)以构建实际视图.尽管使用XML和BML引擎会降低效率,但该技术已被证明更容易学习,对新的视图设计更开放,并且非常适合通过网络发送视图。XPP语言在XML之上定义了一种称为Xpp的高级转换语言,用于指定XML文档的漂亮打印。它的特性类似于XML,但它更简洁,更具可读性,并且它可以仅在子树上执行增量转换。Xpp由一组规则定义(参见图19)组成,这些规则定义将模式与子树的显式变量相匹配。这些变量用于递归调用的正确部分。我们已经定义了格式化函数(水平或垂直对齐、指示等)。设计师可以用它来写他们的漂亮的打印机在规则的正确部分。当Xpp规范被转换为XML样式表时(见图20),设计者只需要指出预期的输出格式(目前是BML、HTML或文本),这对系统选择正确的格式化函数实现是有用的(见图21)。plus(x,y)-> h(x,label("+"),y); Xpp规则指定SmartTools109规则形式主义微小...affect(x,y)-> h(x,label(“=”),y,label(“;”)); plus(x,y)-> h(x,label(“+”),y);...<别名:模板匹配=“加上[*[1]][*[2]][count(*)=2]"><别名:变量名=“left”select="./*[1]“/><别名:变量名=“right”select="./*[2]“/><属性名称=“布局”>属性><添加> <联系我们 语法树基地XSLT转型嵌入式图形组件BML解释器具有样式属性的视图的图形组件样式定义图18.图形视图构造图19. Xpp规范图20.加号运算符每个加号运算符的左和右子树将水平对齐并由+号分隔。h和label格式化函数在所有可用的输出格式中定义Xpp可以通过添加为每种可用的输出格式定义的新格式化函数来扩展SmartTools110XSLT转型XSLT转型XSLT转型用于文本输出的text.xsl用于HTML输出的html.xsl用于BML输出的XSLbml.xsl图21.从Xpp到Xpp逻辑视图对于BML输出,每个转换规则都指定如何构建图形组件的层次结构。这些组件中的一些与树的节点相关联,并且被标记为这样。其他只是语法糖,只是普通的图形对象(未标记)。这种标记技术是一种能够将任何图形对象与其在文档树中的对应节点相匹配的方便方法。当文档树的一部分被修改时,一条更新消息被发送到该文档的视图。更新消息包含已修改子树和新子树的路径。将转换规则应用于新的子树,以创建图形组件的本地层次结构:图形子树。更新消息中包含的路径将根据标记的组件进行解释,并找到过时的图形子树。然后将其替换为新的子树,以反映文档树的修改。基本模块风格定义(字体、颜色等)存储在单独的XML资源文件中,这些文件由Base模块管理。当视图(或任何其他模块)需要样式信息时,Base模块使用访问者在资源(表示为AST)中查找适当的信息。有三个连续的搜索级别:首先在常规资源树上,然后在当前语言特定的资源树上,最后在活动视图特定的资源树上。在每一步中,新发现的信息都会使结果过载.图形用户界面描述语言设计了SmartTools的专用XML语言lmltree来描述用户界面的结构。根据这样的描述,SmartTools通过使用编译引擎转换此描述来构建其用户界面。因此,GUI仅是该描述的视图。图22显示了这样的描述,图23显示了其AST的示意图,图17(第12页)显示了生成的GUI。Xpp文件解析类型化XML树SmartTools111布局框架集水平分割垂直分割垂直分割BmlView“Bean视图”垂直分割BmlView“Bean view2”垂直分割BmlView“Bean view3”StructEditionView“EditionStruct”GtreeView“GTree”浏览“”<?XML version=“1.0”encoding=“ISO-8859-1”?><!DOCTYPE layout SYSTEM“lml.dtd”><布局><拆分位置=“55”方向=“0”><拆分位置=“50”方向=“1”> <拆分位置=“70”方向=“1”> 拆分>拆分><拆分位置=“25”方向=“1”> <拆分位置=“60”方向=“1”>拆分>拆分> 图22岁第12页图17的GUI的Lmltree规范图23.图22中AST的示意图5应用SmartTools已被用于开发或快速原型化几种特定领域语言的各种环境。它的第一个应用程序专用于系统本身使用的语言;它是自举的。例如,创建特定的环境来编辑资源、操作AST定义或访问方法配置文件。通过额外的工作,可以创建更复杂、更强大的环境。开发了Java的集成环境[6]4。图24显示了不同格式的源文件(.java)及其关联的类文件(.class)(即使用不同的精美打印机),如图25所示。这两个文档是链接的,因此一个文档中的选择会传递到另一个文档这个环境的主要工具所有这些工具都使用访问者模式技术,并且可以通过连接方面来动态扩展(例如,使用跟踪或调试功能)。4 由于Java语言很复杂,因此没
下载后可阅读完整内容,剩余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直接复制
信息提交成功