%%%
 %% Keywords in Aspect the AspectBench Compiler.
 %%
 %% @author  Martin Bravenboer <martin.bravenboer@gmail.com>
 %%%
module languages/aspectj/abc/Keyword[JavaCtx AspectCtx PointcutCtx PatternCtx]
imports
  languages/java/JavaMix[PlainJavaTheCtx]

exports

  %%%
   %% Keywords in Java Context
   %%%
  lexical syntax
      "privileged"
    | "aspect"
    | "pointcut"
      -> Keyword[[JavaCtx]]

  %%%
   %% Keywords in Aspect Context
   %%%
  lexical syntax
      "after"
    | "around"
    | "before"
    | "declare"
    | "issingleton"
    | "percflow"
    | "percflowbelow"
    | "pertarget"
    | "perthis"
    | "pointcut"
    | "proceed"
      -> Keyword[[AspectCtx]]

    Keyword[[JavaCtx]] -> Keyword[[AspectCtx]]

  %%%
   %% Keywords in Pointcut Context
   %%%
  lexical syntax
    PrimPointcutName   -> Keyword[[PointcutCtx]]
    Keyword[[JavaCtx]] -> Keyword[[PointcutCtx]]

      "error"
    | "parents"
    | "precedence"
    | "returning"
    | "soft"
    | "throwing"
    | "warning" ->  Keyword[[PointcutCtx]]

  %%%
   %% Keywords in Pattern Context
   %%%
  lexical syntax
    Keyword[[PointcutCtx]] -> Keyword[[PatternCtx]]
    Keyword[[PatternCtx]] -> IdPattern {reject}

  context-free syntax
    "proceed" -> MethodSpec[[AspectCtx]] {cons("Proceed")}