/* abc - The AspectBench Compiler * Copyright (C) 2010 Eric Bodden * * This compiler is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This compiler is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this compiler, in the file LESSER-GPL; * if not, write to the Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ Expr primary_no_new_array = closure_joinpoint.j {: return j; :} ; ExprStmt statement_expression = closure_joinpoint.j {: return new ExprStmt(j); :} ; ClosureJoinpointAccess closure_joinpoint = EXHIBIT name.i LPAREN formal_parameter_list.p? RPAREN block.b LPAREN.l argument_list.a? RPAREN.r {: return new ClosureJoinpointAccess(p,new List()/*no type params*/,new PrimitiveTypeAccess("void")/*no ret type for now (will be inferred)*/,new List()/*no exceptions type for now (will be inferred)*/,b,a,i); :} | EXHIBIT name.i block.b {: return new ClosureJoinpointAccess(new List()/*no params*/,new List()/*no type params*/,new PrimitiveTypeAccess("void")/*no ret type for now (will be inferred)*/,new List()/*no exceptions type for now (will be inferred)*/,b,new List()/*no args*/,i); :} ; BodyDecl aspect_body_declaration = joinpointtype_decl.d {: return d; :} ; MemberCJPTypeDecl joinpointtype_decl = JPI joinpointtype_declexpr.e SEMICOLON {: return e; :} ; MemberCJPTypeDecl joinpointtype_declexpr = type.t IDENTIFIER.i LPAREN formal_parameter_list.l? RPAREN throws.tl? {: return new MemberCJPTypeDecl(new JoinpointTypeDecl(new Modifiers(),i,new List(),t,l,tl)); :} | VOID IDENTIFIER.i LPAREN formal_parameter_list.l? RPAREN throws.tl? {: return new MemberCJPTypeDecl(new JoinpointTypeDecl(new Modifiers(),i,new List(),new PrimitiveTypeAccess("void"),l,tl)); :} ; BodyDecl aspect_body_declaration = cjp_advice_declaration.d {: return d; :} ; CJPAdviceDecl cjp_advice_declaration = modifiers.m? cjp_advice_spec.s throws.t? block.b {: ParserTrace.parserTrace("cjp advice declaration"); return new CJPAdviceDecl(new Modifiers(m), s, new CJPPointcutExpr(), t, b); :} ; //copied from parser of abc.da (clara) AdviceSpec cjp_advice_spec = BEFORE.x name.name LPAREN formal_parameter_list.a? RPAREN.y {: ParserTrace.parserTrace("before(formals)"); AdviceSpec s = new CJPBeforeSpec(a,name); return s; :} | AFTER.x name.name LPAREN formal_parameter_list.a? RPAREN.y {: ParserTrace.parserTrace("after(formals)"); AdviceSpec s = new CJPAfterSpec(a,name); return s; :} | AFTER.x name.name LPAREN formal_parameter_list.a? RPAREN PC_RETURNING.y {: ParserTrace.parserTrace("after(formals)returning"); AdviceSpec s = new CJPAfterReturningSpec(a, new Opt(),name); return s; :} | AFTER.x name.name LPAREN formal_parameter_list.a? RPAREN PC_RETURNING LPAREN RPAREN.y // just to pass ajc tests {: ParserTrace.parserTrace("after(formals)returning()"); AdviceSpec s = new CJPAfterReturningSpec(a, new Opt(),name); return s; :} | AFTER.x name.name LPAREN formal_parameter_list.a? RPAREN PC_RETURNING LPAREN formal_parameter.b RPAREN.y {: ParserTrace.parserTrace("after(formals) returning(p)"); AdviceSpec s = new CJPAfterReturningSpec(a, new Opt(b),name); return s; :} | AFTER.x name.name LPAREN formal_parameter_list.a? RPAREN PC_THROWING.y {: ParserTrace.parserTrace("after(formals)throwing"); AdviceSpec s = new CJPAfterThrowingSpec(a, new Opt(), name); return s; :} | AFTER.x name.name LPAREN formal_parameter_list.a? RPAREN PC_THROWING LPAREN RPAREN.y // ajc compatibility again {: ParserTrace.parserTrace("after(formals)throwing"); AdviceSpec s = new CJPAfterThrowingSpec(a, new Opt(), name); return s; :} | AFTER.x name.name LPAREN formal_parameter_list.a? RPAREN PC_THROWING LPAREN formal_parameter.b RPAREN.y {: ParserTrace.parserTrace("after(formals)throwing(p)"); AdviceSpec s = new CJPAfterThrowingSpec(a, new Opt(b), name); return s; :} | type.a AROUND name.name LPAREN formal_parameter_list.b? RPAREN.y {: ParserTrace.parserTrace("non-void-type around (formals)"); AdviceSpec s = new CJPAroundSpec(b, a, name); return s; :} | VOID.a AROUND name.name LPAREN formal_parameter_list.b? RPAREN.y {: ParserTrace.parserTrace("VOID around (formals)"); AdviceSpec s = new CJPAroundSpec(b, new PrimitiveTypeAccess("void"), name); return s; :} ;