%%
%% Jimple grammar
%%
module languages/jimple/Main
imports
  languages/jimple/Expressions
  languages/jimple/Lexical
  languages/jimple/Modifiers
  languages/jimple/Names
  languages/jimple/Types
  languages/jimple/Statements
  languages/jimple/Whitespace

exports
  sorts File
  context-free syntax
    Modifier* FileType ClassName ExtendsClause? ImplementsClause? FileBody -> File {cons("File")}

  sorts FileType FileBody ExtendsClause ImplementsClause
  context-free syntax
    "class"                                 -> FileType {cons("Class")}
    "interface"                             -> FileType {cons("Interface")}

    "extends"    ClassName                  -> ExtendsClause    {cons("Extends")}
    "implements" {ClassName ","}+           -> ImplementsClause {cons("Implements")}

    "{" Member* "}"                         -> FileBody {cons("FileBody")}

  sorts Member Parameter ThrowsClause
  context-free syntax
    Modifier* Type Name ";"                 -> Member {cons("Field")}
    Modifier* Type Name "(" {Parameter ","}* ")" ThrowsClause? MethodBody -> Member {cons("Method")}

    NonVoidType -> Parameter
    "throws" {ClassName ","}+               -> ThrowsClause {cons("Throws")}

  sorts MethodBody CatchClause
  context-free syntax
    ";"                                     -> MethodBody {cons("Empty")}
    "{" Declaration* Stmt* CatchClause* "}" -> MethodBody {cons("Body")}

    "catch" ClassName "from" LabelName "to" LabelName "with" LabelName ";" -> CatchClause {cons("Trap")}

  sorts Declaration
  context-free syntax
    JimpleType {LocalName ","}+ ";"         -> Declaration {cons("Decl")}