没有合适的资源?快使用搜索试试~ 我知道了~
基于属性文法的面向对象的查询器构造系统APLISA的研究与应用.
理论计算机科学电子笔记164(2006)37-53www.elsevier.com/locate/entcs基于属性文法的面向对象的查询器构造系统APLISADamijan Rebernak,Marjan Mernik Damijan Rebernak,Marjan Mernik1,2马里博尔大学电气工程与计算机科学学院Smetanova ul.斯洛文尼亚马里博尔Pedro Rangel Henriques3米尼奥大学计算机科学Campus de Gualt 4710- 057布拉加,葡萄牙MariaJoZaoVarand aPereira4B r a g a n c a c a mpu S de S a的Polyt ec hnicIn stuteofBrag anca caCampusdeSa。ApoloniaApartado134-5301-857,Braganca,Portugal摘要面向对象技术和概念的使用,如封装和继承,极大地提高了语言规范的模块化,可重用性和可扩展性。 由于语义方面也横切许多语言构造,因此可以使用面向方面的技术实现额外的改进。事实上,面向方面的构造已经被添加到一些语言规范中。LISA编译器构造系统遵循面向对象的方法,并且已经实现了继承性、模块性和可扩展性的机制。向LISA添加方面将导致更多可重用的语言规范。本文介绍了面向方面的属性文法,并将其思想融入到基于属性文法的面向方面编译器生成器AASPLISA中。保留字:属性文法,面向方面编程,编译器生成器。1这项工作由斯洛文尼亚和葡萄牙之间的双边项目BI-PT/04-06-008“基于语法的系统”赞助2 电子邮件:{damijan.rebernak,marjan.mernik}@ uni-mb.si3 电子邮件地址:prh@di.uminho.pt4 电子邮件地址:mjoao@ipb.pt1571-0661 © 2006 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2006.10.00338D. Rebernak等人/理论计算机科学电子笔记164(2006)371引言编程语言定义的挑战是以支持可重用性和可扩展性的方式支持模块化和抽象。随着编程语言的发展,语言设计者经常希望逐步地包含新的语言特性。在开发领域特定语言(DSL)时尤其如此,这些语言比通用编程语言更频繁地变化[19]。理想情况下,语言设计者希望通过重用不同的语言定义模块(例如,语言组件),诸如用于表达式、声明等的模块,而不管可用于指定这种语言组件的不同形式方法。这种方法在基于组件的编程中很常见[26],其中组件可以简单地作为插件。这现在不能做到,即使我们将自己限制在一个正式的方法(抽象状态机,动作语义,代数规范,属性语法,指称语义,操作语义,两级语法等[25]),因为不同的编译器-编译器(自动编译器生成系统)使用不同的和不兼容的规范语言(例如,尽管Eli [8]和FNC-2 [11]都依赖于属性语法,但不能交换在另一个系统中编写的语言定义模块)。此外,即使在相同的规范语言的情况下,这也通常是正确的,因为语法实体(例如,非终端和终端)和语义实体(例如,属性语法中的属性和语义规则)不是模块隐藏部分的组成部分,也不是语言定义模块的参数。例如,当为表达式导入模块时,某些非终结符可能会与现有的非隐藏非终结符冲突,从而产生不期望的结果。这样的模块可以使用非终结符作为参数来参数化,以解决重命名问题。但是,具有数十个参数的模块很难使用。与现代编程语言(如面向对象或函数式语言)相比,20世纪80年代和90年代早期的语言规范远没有那么先进,特别是关于抽象,模块化,可扩展性和可重用性的最近,通用编程语言的概念已经成功地被纳入语言规范。其中,面向对象技术是最成功的技术之一。事实上,这对语言规范有几个好处。为了完全实现模块化,可扩展性和可重用性,这些技术需要与面向方面技术相结合,因为语义方面也横切许多语言结构[21]。在扩展LISA规范语言时已考虑到这些[20] 具有面向方面的特性。本文介绍了一个基于属性文法的面向方面编译器生成器APLISA。本文的结构如下。第2节简要介绍了面向方面编程,第3节介绍了相关工作。论文的主要部分构成了第4节,其中讨论了AASOLISA。第5节提供了一个小型案例研究来说明这些想法。结论意见见第6节。D. Rebernak等人/理论计算机科学电子笔记164(2006)37392面向方面编程软件工程中的主要抽象技术是将系统划分为功能组件,使得对特定组件的更改不会传播到整个系统[6,24]。然而,有些问题(称为方面)是系统范围的,不能放在单个功能组件中。 例如,故障处理、持久性、通信、协调、内存管理是系统行为的各个方面,这些方面往往横切功能组件组。因此,功能组件与方面代码纠缠在一起。这种纠结的问题使得功能组件的可重用性降低,并且难以开发、理解和发展。面向方面编程(AOP)[14]提供了一种解决方案,这是一种将横切程序基本功能的关注点模块化的编程技术。在AOP中,方面语言被用来描述属性,这些属性以干净和模块化的方式横切基本功能。尽管AOP研究的主要部分致力于通用语言[13,18],但在特定领域的语言中也存在类似的问题。例如,在语言规范中,模块化通常基于语言语法结构,而模块化基于不同的方面(例如名称分析,类型检查,代码生成等)。会更有益。为了克服这个问题,可以使用面向方面的技术为了实现系统所需的属性,我们需要一个方面编织器,它通过在适当的连接点编织建议来结合组件和方面语言,并可能涉及合并组件,修改和优化它们。3语言发展面向对象的编程是一种非常有前途的方法,并已成功地用于语言定义和实现的工具中[5,9,12,15,17,28,30]。在此上下文中,方面已用于许多不同的任务(例如,在[28]中,报告了将调试信息编织到DSL规范中的扩展)。在本节的其余部分,我们将更详细地描述该领域中一些更相关的贡献,使用语言规范或实现中的。3.1JastAddJastAdd [9]是一个用于编译器构造的基于Java的系统。JastAdd以抽象语法树(AST)的面向对象表示为非终结符充当抽象超类,而产生式充当指定语法结构、属性和语义规则的专用具体子类。所有这些元素都可以在子类中被继承、特殊化和重写。JastAdd中面向方面的思想是在单独的类中定义语言的每个方面,然后在适当的地方将它们编织在一起。JastAdd系统是一个类编织器:它读取所有JastAdd模块,并在生成AST类的过程中将字段和方法编织到适当的类中。40D. Rebernak等人/理论计算机科学电子笔记164(2006)37通过在不同的类中分离不同的语言方面,开发人员可以使用Java的所有功能来指定方面。在下面的例子中,取自[9],两个不同的方面在不同的类中描述第一个(typechecker.jadd)执行表达式的类型检查并计算布尔字段typeError。jadd(第二个例子)实现了一个unparser,它使用字段typeError来报告类型检查错误。//typechecker.jaddclass Exp {int getString(String);}classAdd {boolean typeError;void typeCheck(StringexpectedType){ getExp1().typeCheck(“int”); getExp2().typeCheck(“int”);typeError= expectedType!=“int”;}}//unparser.jaddimportDisplay;classStmt {public void online();}classAdd {public void run(){...if()d.showError(“类型不匹配”);}}每个字段,方法,导入声明都被编织到所有生成的AST类中,如下面的示例所示classASTAdd extendsASTExp {//访问接口getExp1(){... 个文件夹System.out.println(){//从typechecker.jaddboolean typeError;void typeCheck(StringexpectedType){ getExp1().typeCheck(“int”); getExp2().typeCheck(“int”); typeError= expectedType!=“int”;}//从unparser.jaddpublic void run(){...if()d.showError(“类型不匹配”);...}}从上面的例子中可以看出,这种方法并不遵循传统的AOP连接点模型(JPM),在传统的AOP连接点模型中,连接点是使用切入点模式语言指定然而,它可以被看作是ANOJ [13]中的类型间声明,其中连接点是程序中的所有非匿名类型,切入点是类或接口的名称。D. Rebernak等人/理论计算机科学电子笔记164(2006)37413.2Aubrig为了生成附加的基于语言的工具(例如,调试器)需要在语言规范的几个地方添加新的规范[10]。这些新的添加可以被视为方面(例如,调试方面)。有人观察到[28]这些方面横切基本语言规范。因此,面向方面的语言AALOG [2]是为ANTLR语言定义[1]中横切关注点的模块化实现而创建的由于ANTLR属于语法导向的翻译(语义规则没有声明性地指定,语义规则的顺序很重要),所以APLG使用以下模型:• 连接点是语言规范中的静态点,其中可以编织额外的方面,• 切入点指定连接点并且不仅包括语法的语法级别而且包括与特定语法相关联的语义(参见下面示例中的within和match构造),• advice类似于ANOWJ概念(之前和之后),并将切入点和代码体结合在一起。下面显示了一个在ANORG中的切入点和建议的例子...命令:(右{}...fileio.print(“//向右移动”); fileio.print(“x=x+1;”);fileio.print(“time=time+1;”);切入点count_gpllinquerber():within(command.*) &&match(fileio.print(“x=x+1;”);after():count_gpllinquerber(){gplbeginline=fileio. getLincoln();gplendline=fileio.getLincoln();}编织的结果是:...命令:(右{}...“//move right”); fileio.print(“x=x+1;”);gplendline = fileio.getLineuber();fileio.print(“time=time+1;”);3.3阿斯塔纳ASFAASPASF [15]是一种简单的方面语言,用于以ASF+SDF [27]形式编写的语言规范。仅支持重写规则。因此,在AASFASF中的连接点是描述语言语义的等式规则中的静态点。ApplusASF中的切入点模式语言是一种非常简单的模式匹配语言,它只匹配方程的标签和左边。切入点可以有两种类型:输入42D. Rebernak等人/理论计算机科学电子笔记164(2006)37等式(在左手边的成功匹配之后)和退出等式(就在返回右手边之前)。在ApplusASF语言中切入点的例子(本节中的所有例子都来自[15])是:[_]匹配所有方程[_] eval(_,_)匹配所有带有最外层符号的方程eval[_] eval(_,Env)匹配所有带有第二个参数的方程Env变量[int*]_或[real*]_匹配所有带有int.标签的方程。还是真的建议代码指定了以ASF形式主义编写的附加方程。有两种类型的通知:在进入方程之后(将方程连接到由切入点匹配的方程列表的开头)和在退出方程之前(将方程连接到由切入点匹配的方程列表的结尾)。下面显示了一个AASFASF的示例。[1]Env==============================evs(Stat;Stat*,Env)=pointcut statementStep:entering [_] evs(Stat; Stat*,Env)after:statementStep tide-step(get-location(Stat))在织入发生之后,方面被织入原始的语言规范。换句话说,附加的等式被附加到适当的位置。[1]tide-step(get-location(Stat)),EnvEnv’’==============================evs(Stat;Stat*,Env)=3.4其他相关工作Boyland [4]的工作,其中模式匹配用于避免在属性语法的多个产生式中重复相同的概念(语义),[7]可以被视为属性语法中面向方面的早期方法。在[7]中,引入了模块化属性伽马(MAG)。编程语言的语义是使用几个MAG规则和模板定义的。MAG规则类似于属性语法:它由许多模式组成,每个模式与一个或多个模板相关联。模式匹配原始上下文无关文法(CFG)中的一组产生式,模板指定为每个匹配的MAG(与模板)和上下文无关的语法被进一步翻译成单体属性语法。从我们的观点来看,MAG和模板可以被看作是属性语法的面向方面的扩展,因为每个MAG代表最终属性语法规范的一个方面。除了本节前面提到的面向方面的规范化语言之外,还有在编译器开发中直接利用现有AOP语言的实践。例如,在[29]中,作者展示了他们在编译器构造的语义实现中使用ANOJ的经验。通过利用D. Rebernak等人/理论计算机科学电子笔记164(2006)3743在AOP概念中,每个语义路径都被完全描述为横切生成的AST节点类的方面这些语义操作,传统上作为访问者类实现,被重写为类型间声明(ITD),而那些应用于一组节点的操作代码被指定为连接点。ITD和连接点的结合使得阶段组合和树遍历变得容易。实验结果表明,在ANOJ中的各种语言结构(例如,类型间声明、切入点通知模型、静态方面成员和方面继承)很好地适应了编译器定义的各种计算需求,这导致编译器实现具有改进的模块性和更好的关注点分离。4阿西娜·丽莎4.1LISA简介在LISA项目[20,22]中,主要目标之一是实现增量语言开发。人们很快就认识到继承是非常有用的,因为它是一种语言机制,允许新的定义基于现有的定义。一个新的规范可以继承其祖先的属性,并可能引入新的属性来扩展,修改或击败其继承的属性。在面向对象的语言中,由实例变量和方法组成的属性是可以修改的.基于属性语法的语言定义中的相应属性是:• 词汇规则定义,• 属性定义,• 规则,其是封装语义规则的通用语法规则,以及• 语义域上的操作因此,常规定义、产生式规则、属性、语义规则和语义域上的操作可以从祖先规范继承、专门化或覆盖。在这种方法中,属性语法作为一个整体受到继承采用一个非常简单的移动机器人的语言可以说明我们的增量语言开发方法[22]。机器人运动的语言定义见图1。机器人可以在不同的方向上移动,任务是计算它的最终位置。随着时间的推移,该语言扩展了新的功能。例如,我们想知道机器人何时到达最终位置。新语言(RobotTime)被指定为Robot语言的扩展(图2)。这是一个很好的例子,说明了在我们的方法中,不同的方面是如何模块化的。在Robot语言中,仅描述了机器人运动的语义规则,而RobotTime语言仅包含时间计算的语义规则。RobotTime语言继承了Robot语言的常规定义、语法结构和语义规则,并添加了新的语义规则44D. Rebernak等人/理论计算机科学电子笔记164(2006)37时间计算。注意,在面向方面的系统(如JastAdd [9])中,隐式切入点也可以获得相同的效果(参见第3节)。语言机器人{词典{剩下的命令|权|起来|下ReservedWord开始|端ignore [\0x0D\0x0A\]//跳过空格}attributes Point *.inp,*.outp;规则开始{START::=beginCOMMANDSendcompute{ START.outp =COMMANDS.outp;//开始}; return new Point(0,0);}规则移动{COMMANDS::= COMMAND COMMANDScompute{COMMANDS[0].outp = COMMANDS[1].outp;//位置 COMMAND.inp =COMMANDS[0].inp;//传播到子命令 COMMANDS[1].inp = COMMAND.outp;}| {COMMANDS.outp =COMMANDS.inp;};}规则移动{//每个命令改变一个坐标Command::= left compute{COMMAND.outp=newPoint((COMMAND.inp).x-1,(COMMAND.inp). };Command::= right compute{COMMAND.outp=newPoint((COMMAND.inp).x+1,(COMMAND.inp). };COMMAND::=upcompute{COMMAND.outp=newPoint((COMMAND.inp).x,(COMMAND.inp).y+1);};COMMAND::=downcompute{COMMAND.outp=newPoint((COMMAND.inp).x,(COMMAND. intn(i);};}}Fig. 1. 使用LISA的如前所述,面向对象的技术和概念需要与面向方面的技术相结合,以实现更好的模块化、可扩展性和可重用性。以下各节将进一步介绍此问题语言RobotTime扩展机器人{double *.time;规则扩展开始{计算{//初始位置被继承START.time = COMMANDS.time;}}规则扩展移动{COMMANDS::= COMMAND COMMANDScompute{// total time是子命令COMMANDS[0].time = COMMAND.time + COMMANDS[1].time;}| {COMMANDS.time =0;};}rule extendsmove {//每个命令花费1个时间步COMMAND::=leftcompute{ COMMAND.time =1;};COMMAND::= right compute{ COMMAND.time =1;}COMMAND::= up compute{ COMMAND.time =1;};COMMAND::= downcompute{ COMMAND.time =1;}图2. 使用LISA的}D. Rebernak等人/理论计算机科学电子笔记164(2006)37454.2面向属性的属性文法面向属性文法(Aesthet-oriented attribute grammar,AesthetAG)是一种属性文法[16],扩展了切入点和建议规范[14],AesthetAG=(G,A,R,Pc,Ad)。上下文无关文法G=(N,T,S,P),属性集A,语义集tic规则R具有与属性语法相同的标准含义,例如在[20]中描述的。切入点Pc是一组切入点产生式,Pc ={pc1,.,pc m},其中切入点生产pci,1 ≤i≤m,具有以下形式:pc i :LHS→RHS在切入点生产的pc i特殊符号(.. ,则可以使用。通配符“通配符".. ’ denotes zero ormore symbols and can be used only in the符号Xi,1≤i≤r,是来自LHS和RHS的符号,表示通知的公共接口。A pointcut production pc i:LHS→RHS,选择生产p:X0→X1. Xn∈P如果X0匹配LHS和X1. Xn匹配RHS。设Pm i表示由pintcutprocinp ci 选择的产生式的集 合,Pm i={pi|pi∈Panddpiismatchedbypci}.MATCED由切入点Pc选择的生产Pm然后被定义为Pm=i=1..mPmi,下午好。 为了匹配生产Pm,建议Ad是附加的。Ad是一组建议,Ad ={ad1,...,ad l},其中建议ad k,1 ≤k≤l,具有以下形式:adk S1,...,在pci{ Rsk}语义规则Rsk具有以下形式:Rs,k={Sj,a = f(yi,.,y k)|a∈A(Sj),yi∈(A(S1)<$. {A(Sr)),1≤i≤k}定义符号Sj(1≤j≤r)的属性由Rsk中的语义规则定义。建议adk被应用于切入点pci,其匹配产生式Pmi。对于每个匹配产生式pi∈Pmi,通过用实际符号Xj(在adk中指定)替换形式符号S j(在ad k中指定)来获得实际语义规则集Rakiinpci)inRsk. 从建议Ad和切入点获得的语义规则集RaPc定义为Ra =k= 1。l,i =1.我是拉基,需要和普通人合并语义规则Rpi,以获得定义良好的属性文法AG=(G,A,RJ),J J J1、R1=R2=R3 = R4= R5 = R6= R7 = R8 = R9k=1.. lRa ki),R =i= l. nRpi. 注意(G,A,R,Pc,Ad)=(G,A,RJ). 因此,面向方面的属性文法是一种属性语法,其中一些语义规则没有显式地附加到产生式规则,而是隐式地作为建议附加到由切入点选择的产生式中。合并语义规则时,每个定义属性只有一个46D. Rebernak等人/理论计算机科学电子笔记164(2006)37语义规则D. Rebernak等人/理论计算机科学电子笔记164(2006)3747必须存在,否则属性语法没有很好的定义[16]。下面是一个简单的例子:普通属性语法规范:p0:A→B C{A.x= B.x +C.x;B.y =0;C.y =1;}//Rp0p1:B→aB{B0. x=B1.x;B1. y=B0. y+1;}//Rp1p2:B→β{B.x= B.y;}//Rp2p3:C→c{ C.x= C.y+ 2;}//Rp3切入点:pc 1:B →..//匹配p1和p2pc2 A,B>:A→B *// 匹配p0建议:ad1X> on pc1{ X.z=1;}//Ra11={ B.z=1;}//Ra12={B.z=1;}ad2 Y,X>onpc2{Y.w = X.z;}//Ra20={A.w = B.z;}最终语义规则:RP=Rp0- Ra20={A.x= B.x+ C.x; B.y= 0; C.y= 1;A.w = B.z;}RP=Rp1- Ra11={B0. x=B1.x;B1. y=B0. y+1;B. return1;}RP=Rp2, Ra12={B.x= B.y; B.z= 1;}RP=RP3={C. x=C。y+2;}4.3AAPOLISA构建体如图1和图2所示,LISA实现了良好的模块化和可扩展性属性语法规范。然而,仍然存在新的语义方面横切基本模块结构的情况。换句话说,一些语义规则需要在不同的产生式中重复(例如,语义规则COMMAND.time=1;其中必须复制RobotTime语言的服务时间为了避免这种不愉快的情况,面向方面的属性语法,如4.2小节所述,已被纳入LISA语言规范。这个扩展名为AALLISA。AspectLISA中的连接点是语言规范中的静态点,可以附加额外的语义规则。这些点可以是句法产生式规则或一般化的LISA规则。产生式匹配发生在作为广义LISA规则成员的产生式上。一个切入点可以在整个语言层次上匹配不同语言的产生式。对于每个切入点,我们可以定义几个建议,这些建议是作为原生Java赋值语句编写的参数化语义规则在AOP中,存在几种将方面应用于切入点的不同方法,如之前,之后和周围[13]。在APLISA中,只有一种方法可以在特定的切入点上应用建议,因为属性语法是声明性的,并且语义规则中的等式顺序并不重要。因此,在连接点之前/之后应用通知不适用。APLISA规范语言,包括面向顶点的特性、切入点和建议,有以下部分(注意4.2节中定义的切入点和建议是如何用LISA规范语言编写的):languageL1[extendsL2,.,LN]{词典{[[Q] 覆盖|[问] 延伸]R 普通快递48D. Rebernak等人/理论计算机科学电子笔记164(2006)37.}attributes type在1,..., 在M.p〇itcutP<[S1,. ,Sr]>L. Y:LhsP::=RhsP;..a dvice[[B]extendtends|[B]overrid es]A<[T1,. ,Tr]>在P{语义功能}..规则[[Y]扩展|[Y] overrides]Z {X::= X 11X 12.X1pcompute{语义功能}..|Xr1Xr2.. .Xrtcompute{语义功能};}.方法[[N]覆盖|[N] extends]M {语义域}..}在上述正式APLISA规范中使用的符号具有以下含义:• L• Q和R• At• P• S• LhsP和RhsP-• 一• T• X• Y和Z• N和M本节只关注LISA规范语言的新的面向方面特性,即切入点和通知。切入点使用保留字pointcut来定义。 每个切入点都有一个唯一的名称和一个实际参数列表(advice的语义函数正如我们已经提到的,连接点是静态的语言规范中可以应用建议的点。在切入点定义中,可以使用两个通配符。那个... ’matches zero or more terminal or的规则。字符串“D. Rebernak等人/理论计算机科学电子笔记164(2006)3749一个象征为了说明APLISA切入点模型,我们给出了一些切入点规范的例子,定义在机器人语言上(图1)。1,Fig.2)的情况。*.* :*::=..匹配当前语言层次结构中所有语言中任 何规则中 的任何结果RobotTime.m*:*::=..匹配所有规则中以我在RobotTime语言*.* :COMM*::=.. * D匹 配 任何规则中的所 有 产 品 , 其 左 侧 符 号 满 足 模 式“COMM*”,并且右侧的最后一个符号以D结束Robot.move:COMMAND::= left只匹配机器人语言的规则移动APLISA中的通知是可以附加在特定连接点的附加语义。为了提高可重用性,建议被参数化。参数可以是终端或非终端符号,并在编织时进行计算建议是使用保留字的意见,并包含信息关于建议出现的切入点。下面是一个建议的例子;更多建议和切入点的例子在第5节中提供。pointcutSimpleCommand COMMAND>*.move: COMMAND::=*; advice SetTime C> on SimpleCommand{ C.time =1;}在Robot-Time语言中,在切入点SimpleCommand上编织建议SetTime的结果是在规则Robot.move的所有产生式中增加了一条语义规则COMMAND.time = 1;。符号比图2中的简单得多。该语言的新方面,即时间计算,在一个地方(通知)描述,并没有在几个产品中重复。4.4AALLISA遗传APLISA规范语言是LISA的扩展,具有两种新机制(切入点和建议)。显然,切入点和通知也可以从祖先规范继承。需要采用[20]中描述的多属性语法继承的形式定义。由于篇幅有限,本文只给出了切入点继承的形式化定义和建议。关于理论背景和进一步的细节,读者可以参考[20]。面向方面的属性文法的属性包括词法规则定义、属性定义、规则(封装语义规则的广义语法规则)、切入点、建议和语义域上的方法。属性=Regdef名称+属性名称+规则名称+策略名称+建议名称+方法名称对于语言l中的每个切入点pc,切入点(l)(pc)是在语言l的层次结构上匹配到切入点pc的匹配产生式P的有限集合。P点切:语言→ P点切名称→匹配P生产规则P点切s(l)(pc)={pi|pi∈P,pi:Xi0→Xi1Xi2. Xin,match(pi,pc)}对于附加到语言l中的切入点pc的每个建议ad,建议(l)(ad)(pc)是对(p,Rp)的有限集合(p_sem),其中p是产生式,Rp是并集 与产生式p相关联的语义规则的有限集合,以及语义规则50D. Rebernak等人/理论计算机科学电子笔记164(2006)37(def inedRp)由advicead定义,其中advice的正式符号由pointcutpc中定义的实际符号替换。建议:语言→建议名称→P ointcutN ame→用户建议(l)(ad)(pc)={(p,Rp)|p∈P割点(l)(pc),p:X0→X1X2. Xn,R p={X i.a = f(X0.b,. 、X j.c)|X i.a ∈ Def Attr(p)}定义R p(ad,pc)}多面向方面的属性语法继承定义如下。令Δ Δ G1、Δ G2、.,ANOMAG可以是面向方面的属性语法,其正式定义为:Δ G1=(G1,A1,R1,Pc1,Ad1),Δ G2=(G2,A2,R2,Pc2,Ad2),.Δ Gm=(Gm,Am,Rm,P cm,Adm),则ARAGAG= ARAGAG2.. . Δ AG mΔ AG1,其中Δ Δ AG1继承自ANOVAG2,.,ANONAG m,定义为:Δ G=(G,A,R,Pc,Ad),其中G=G2型.. . Gm一=一克... gAm,R=R1型.. . 你好,PC=Pc1g.. . gPcm,Ad=广告1条. 我的朋友因此,切入点上的继承以与at-tribute类似的方式定义[20]。切入点和属性不能被扩展,但是可以从祖先属性语法继承。另一方面,有可能某些切入点在当前规范中被重新定义,而这些规范覆盖了祖先规范中指定的切入点。建议继承的定义与语义规则R[20]类似。这并不奇怪,因为建议只是需要在适当的连接点编织的附加语义规则4.5AALLISA新奇APLISA是第一个基于属性语法的规范语言,使用显式切入点模型。注意,在JastAdd中,切入点模型是隐式的。ANORG中的poincut模型更复杂,因为语法和语义级别都涉及到规范。这是由于使用语法指导的transla- tion,而不是属性语法。AASF使用非常简单的模式匹配语言,其中只有以ASF形式主义编写的等式的标签和左手边可以匹配。现有的系统都不支持通知和切入点的继承。此外,AASOLISA中的建议在语法符号上被参数化,因此更可重用。5使用AASOLISA每个LISA语言规范也是一个常规的APLISA规范。在第3.3节中,RobotTime语言被指定为Robot的D. Rebernak等人/理论计算机科学电子笔记164(2006)3751语言RobotTime扩展机器人{double *.time;pointcutBegin START,COMMANDS> *.start:START::=.. 命令;切入点SimpleCommand命令>*.move:COMMAND::= *;pointcutNoCommands COMMANDS>*.moves:COMMANDS::=0;pointcutSeqCommands COMMANDS[0],COMMAND,COMMANDS[1]>*.moves:COMMANDS::= COMMAND COMMANDS;advice Init S,C> on Begin{ S.time = C.time;}建议SetTime C> on SimpleCommand{ C.time=1;}建议ClearTime Cs> on NoCommands { Cs.time=0;}建议SumTime C0,CM,C1>onSeqCommands{ C0.time = CM.time + C1.time;}}图三. RobotTime语言使用APLISA语言使用多属性语法继承。可以注意到,语义规则(COMMAND.time=1;)必须在多个产品(COMMAND::=左,命令::=右,COMMAND::= up,命令::=向下)。RobotTime语言中的新语义可以被视为横切语言结构的新方面因此,RobotTime语言可以使用面向方面的属性语法更好地规范。图3显示了用APLISA编写的RobotTime语言规范。请注意,已经指定了四个切入点,它们匹配Robot语言中的所有七个产品。例如,切入点Begin匹配生产START::= begin COMMANDSend,切入点SimpleCommand匹配生产COMMAND::= left,Command::= right,Command::= up,Command::= down。对于每个切入点,附加了定义匹配结果的新语义的建议(例如,简单命令的语义是每个命令花费一个时隙C.time= 1;)。在[22]中,RobotSpeed语言被定义为Robot-Time语言的扩展一个额外的速度结构已经被添加到语言中,这样机器人现在可以以不同的速度移动。RobotSpeed语言可以纯粹用面向方面的技术来指定,如图4所示。注意,所有来自RobotTime语言的切入点都被继承了。只有新的建议必须用关于移动速度的附加语义来定义。因此,new advice扩展了先前继承的advice在图3和图4中,示出了APLISA的说明性示例。该方法可扩展到更大的语言,并已用于重新指定Aspect-COOL语言[3],它是COOL(面向类对象语言)5的面向方面扩展。语言规范中方面的典型示例可以是附加代码生成、不同的语言扩展(例如,异常处理,我们的COOL语言不应该与Lopes早期的领域特定面向方面的COOL语言混淆。52D. Rebernak等人/理论计算机科学电子笔记164(2006)37语言RobotSpeed扩展RobotTime {词典{命令速度编号[0-9]+}int *.inspeed,*.outspeed;规则扩展开始{计算{}}规则速度{Command::=speed #Numbercompute{COMMAND.time =0;//此命令不花费时间COMMAND.outspeedint n = num. num. nums();//此命令不会更改位置Command.outp = Command.inp;};}advice extends Init S,C>{ C.inspeed= 1;//开始速度S.outspeed= C.outspeed;}advice SpeedPropagationextends SumTime C0,CM,C1>{ CM.inspeed= C0.inspeed;//速度传播 C1.inspeed =CM.outspeed;//到子命令 C0.outspeed = C1.outspeed;}建议SameTime扩展ClearTime Cs> { Cs.outspeed= Cs.inspeed;}advice CalculateTime extends SetTime C>{C.time = 1.0/C.inspeed;C.outspeed= C.超速;}}见图4。 RobotSpeed语言,使用APLISA方面、新范例)、语言规范调试、属性跟踪。6结论在本 文中, 面向 方面的 属性文 法已被 提出 并正式 定义。 这一概 念已 被纳入AASPLISA,一个面向方面的编译器生成器的基础上属性文法。面向对象的编程是一种非常有前途的方法,并已成功地用于语言定义和实现的工具。我们回顾了这一领域的一些已知贡献,作为我们提出建议的动机。LISA已经有了支持继承和模块化的机制。这些机制很好地支持了面向对象方面的概念;另一方面,添加方面将允许编写更简单的规范,例如避免语义规则的重复编程语言定义的挑战还在于支持可重用性和可扩展性:方面将加强这些特性。由于编程语言的不同概念可以在不同的模块中单独设计和实现,因此由于继承,这些模块的
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 电容式触摸按键设计参考
- 西门子MES-系统规划建议书(共83页).docx
- 6、毕设参考资料 for.pdf
- hive基础查询文档上传
- RouterOS PPPOE 多拨负载均衡PCC.pdf
- 微机系统实验一学习笔记(个人监督)
- 基于SpringBoot的企业客户管理系统源码数据库.docx
- 基于springboot的IT技术交流和分享平台源码数据库.docx
- 基于springboot的图书馆管理系统源码数据库.docx
- 基于SpringBoot的在线拍卖系统源码数据库.docx
- 基于springboot的网上点餐系统源码数据库.docx
- 基于SpringBoot的网上订餐系统源码数据库.docx
- 基于SpringBoot的在线视频教育平台源码数据库.docx
- 基于springboot的中小型医院网站源码数据库.docx
- 基于springboot的中药实验管理系统源码数据库.doc
- 基于springboot的校园周边美食探索及分享平台源码数据库.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功