/* 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. */ /* add the possibility of declaring an jpi to type_declaration */ TypeDecl type_declaration = jpi_declaration.d {: return d; :} ; JPITypeDecl jpi_declaration = JPI joinpointtype_declexpr.d SEMICOLON {: JoinpointTypeDecl a = d.getJoinpointTypeDecl(); a.getModifiers().addModifier("public"); abc.ja.jpi.utils.JPIAudit.JPI.JPI++; return new JPITypeDecl(a.getModifiers(), a.getID(), a.getBodyDecls(), a.getTypeAccess(), a.getParameters(), a.getExceptions(), new DummyAccess("","$RootJPI$"),new List()); :} | LT type_parameter_list_1.c JPI joinpointtype_declexpr.d SEMICOLON {: JoinpointTypeDecl a = d.getJoinpointTypeDecl(); a.getModifiers().addModifier("public"); abc.ja.jpi.utils.JPIAudit.JPI.generic++; return new GenericJPITypeDecl(a.getModifiers(), a.getID(), a.getBodyDecls(), a.getTypeAccess(), a.getParameters(), a.getExceptions(), new DummyAccess("","$RootJPI$"),new List(), c); :} | JPI joinpointtype_declexpr.d EXTENDS name.i LPAREN parameter_list_inheritance.l? RPAREN SEMICOLON{: JoinpointTypeDecl a = d.getJoinpointTypeDecl(); a.getModifiers().addModifier("public"); abc.ja.jpi.utils.JPIAudit.JPI.JPI++; return new JPITypeDecl(a.getModifiers(), a.getID(), a.getBodyDecls(), a.getTypeAccess(), a.getParameters(), a.getExceptions(), i, l); :} | LT type_parameter_list_1.c JPI joinpointtype_declexpr.d EXTENDS name.i LPAREN parameter_list_inheritance.l? RPAREN SEMICOLON{: JoinpointTypeDecl a = d.getJoinpointTypeDecl(); a.getModifiers().addModifier("public"); abc.ja.jpi.utils.JPIAudit.JPI.generic++; return new GenericJPITypeDecl(a.getModifiers(), a.getID(), a.getBodyDecls(), a.getTypeAccess(), a.getParameters(), a.getExceptions(), i, l, c); :} | GLOBAL JPI joinpointtype_declexpr.d COLON pointcut_expr.e SEMICOLON {: JoinpointTypeDecl a = d.getJoinpointTypeDecl(); a.getModifiers().addModifier("public"); abc.ja.jpi.utils.JPIAudit.JPI.global++; return new GlobalJPITypeDecl(a.getModifiers(), a.getID(), a.getBodyDecls(), a.getTypeAccess(), a.getParameters(), a.getExceptions(), new DummyAccess("","$RootJPI$"),new List(), e); :} | LT type_parameter_list_1.c GLOBAL JPI joinpointtype_declexpr.d COLON pointcut_expr.e SEMICOLON {: JoinpointTypeDecl a = d.getJoinpointTypeDecl(); a.getModifiers().addModifier("public"); abc.ja.jpi.utils.JPIAudit.JPI.genericGlobal++; return new GenericGlobalJPITypeDecl(a.getModifiers(), a.getID(), a.getBodyDecls(), a.getTypeAccess(), a.getParameters(), a.getExceptions(), new DummyAccess("","$RootJPI$"),new List(), c, e); :} ; List parameter_list_inheritance = simple_name.n {: return new List().add(n); :} | parameter_list_inheritance.l COMMA simple_name.n {: return l.add(n); :} ; /* add the possibility of declaring an exhibit to class_member_declaration */ BodyDecl class_member_declaration = exhibit_declaration.d {: return d; :} ; ExhibitBodyDecl exhibit_declaration = EXHIBITS type.a name.b LPAREN formal_parameter_list.c? RPAREN COLON pointcut_expr.d SEMICOLON {: abc.ja.jpi.utils.JPIAudit.Exhibits.exhibits++; return new ExhibitBodyDecl(a, b, c, d); :} | LT type_parameter_list_1.e EXHIBITS type.a name.b LPAREN formal_parameter_list.c? RPAREN COLON pointcut_expr.d SEMICOLON {: abc.ja.jpi.utils.JPIAudit.Exhibits.generic++; return new GenericExhibitBodyDecl(a, b, c, d, e); :} | EXHIBITS VOID name.b LPAREN formal_parameter_list.c? RPAREN COLON pointcut_expr.d SEMICOLON {: abc.ja.jpi.utils.JPIAudit.Exhibits.exhibits++; return new ExhibitBodyDecl(new PrimitiveTypeAccess("void"), b, c, d); :} | LT type_parameter_list_1.e EXHIBITS VOID name.b LPAREN formal_parameter_list.c? RPAREN COLON pointcut_expr.d SEMICOLON {: abc.ja.jpi.utils.JPIAudit.Exhibits.generic++; return new GenericExhibitBodyDecl(new PrimitiveTypeAccess("void"), b, c, d, e); :} | EXHIBITS type.a name.b LPAREN formal_parameter_list.c? RPAREN SEMICOLON {: abc.ja.jpi.utils.JPIAudit.Exhibits.seal++; return new ExhibitBodyDecl(a, b, c, new EmptyPointcutExpr()); :} | LT type_parameter_list_1.e EXHIBITS type.a name.b LPAREN formal_parameter_list.c? RPAREN SEMICOLON {: abc.ja.jpi.utils.JPIAudit.Exhibits.seal++; return new GenericExhibitBodyDecl(a, b, c, new EmptyPointcutExpr(), e); :} | EXHIBITS VOID name.b LPAREN formal_parameter_list.c? RPAREN SEMICOLON {: abc.ja.jpi.utils.JPIAudit.Exhibits.seal++; return new ExhibitBodyDecl(new PrimitiveTypeAccess("void"), b, c, new EmptyPointcutExpr()); :} | LT type_parameter_list_1.e EXHIBITS VOID name.b LPAREN formal_parameter_list.c? RPAREN SEMICOLON {: abc.ja.jpi.utils.JPIAudit.Exhibits.seal++; return new GenericExhibitBodyDecl(new PrimitiveTypeAccess("void"), b, c, new EmptyPointcutExpr(), e); :} ; /* add the possibility of declaring the invPCD to basic_pointcut_exrp */ PointcutExpr basic_pointcut_expr = // following two rules, ajc only allows * or a fully-defined type/id | PC_THIS_INV.x LPAREN type_id_star.a RPAREN.y {: ParserTrace.parserTrace("THISINV pointcut"); abc.ja.jpi.utils.JPIAudit.PCD.thisInv++; return new ThisInvPointcutExpr(a); :} | PC_TARGET_INV.x LPAREN type_id_star.a RPAREN.y {: ParserTrace.parserTrace("TARGETINV pointcut"); abc.ja.jpi.utils.JPIAudit.PCD.targetInv++; return new TargetInvPointcutExpr(a); :} // for args, ajc only allows each arg to be * .. or fully-defined type/id | PC_ARGS_INV.x LPAREN type_id_star_list.a? RPAREN.y {: ParserTrace.parserTrace("ARGSINV pointcut"); abc.ja.jpi.utils.JPIAudit.PCD.argsInv++; return new ArgsInvPointcutExpr(a); :} | PC_GLOBAL LPAREN RPAREN {: ParserTrace.parserTrace("GLOBAL pointcut"); abc.ja.jpi.utils.JPIAudit.PCD.global++; return new GlobalExpr(); :} ; AdviceSpec cjp_advice_spec = LT type_parameter_list_1.c BEFORE.x name.name LPAREN formal_parameter_list.a? RPAREN.y {: ParserTrace.parserTrace("before(formals)"); AdviceSpec s = new GenericCJPBeforeSpec(a, name, c); return s; :} | LT type_parameter_list_1.c AFTER.x name.name LPAREN formal_parameter_list.a? RPAREN.y {: ParserTrace.parserTrace("after(formals)"); AdviceSpec s = new GenericCJPAfterSpec(a, name, c); return s; :} | LT type_parameter_list_1.c AFTER.x name.name LPAREN formal_parameter_list.a? RPAREN PC_RETURNING.y {: ParserTrace.parserTrace("after(formals)returning"); AdviceSpec s = new GenericCJPAfterReturningSpec(a, new Opt(),name, c); return s; :} | LT type_parameter_list_1.c 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 GenericCJPAfterReturningSpec(a, new Opt(),name, c); return s; :} | LT type_parameter_list_1.c 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 GenericCJPAfterReturningSpec(a, new Opt(b),name,c); return s; :} | LT type_parameter_list_1.c AFTER.x name.name LPAREN formal_parameter_list.a? RPAREN PC_THROWING.y {: ParserTrace.parserTrace("after(formals)throwing"); AdviceSpec s = new GenericCJPAfterThrowingSpec(a, new Opt(), name, c); return s; :} | LT type_parameter_list_1.c 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 GenericCJPAfterThrowingSpec(a, new Opt(), name, c); return s; :} | LT type_parameter_list_1.c 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 GenericCJPAfterThrowingSpec(a, new Opt(b), name, c); return s; :} | LT type_parameter_list_1.c type.a AROUND name.name LPAREN formal_parameter_list.b? RPAREN.y {: ParserTrace.parserTrace("non-void-type around (formals)"); GenericCJPAroundSpec s = new GenericCJPAroundSpec(b, a, name, c); return s; :} | LT type_parameter_list_1.c VOID.a AROUND name.name LPAREN formal_parameter_list.b? RPAREN.y {: ParserTrace.parserTrace("VOID around (formals)"); GenericCJPAroundSpec s = new GenericCJPAroundSpec(b, new PrimitiveTypeAccess("void"), name, c); return s; :} ; Modifier modifier = OPEN {: return new Modifier("open"); :} | SEALED {: return new Modifier("sealed"); :} ;