module languages/java/syntax/ClassDecl

imports languages/java/syntax/Statements 
imports languages/java/syntax/MethodDecl 
imports languages/java/syntax/Interfaces 
imports languages/java/syntax/ConstructorDecl

exports
  sorts ClassBody ClassDeclaration Super Interfaces ClassBodyDeclaration ClassMemberDeclaration StaticInitializer

  context-free syntax
    Modifier* "class" Identifier Super? Interfaces? ClassBody -> ClassDeclaration {cons("class1")}
    "extends" ClassType					      -> Super {cons("extends")}
    "implements" {InterfaceType ","}+			      -> Interfaces {cons("implements-comma")}
    "{" ClassBodyDeclaration* "}"			      -> ClassBody {cons("ClassBodyDeclaration-s")}
    ClassMemberDeclaration				      -> ClassBodyDeclaration {cons("ClassMemberDeclaration")}
    StaticInitializer					      -> ClassBodyDeclaration {cons("StaticInitializer")}
    ConstructorDeclaration				      -> ClassBodyDeclaration {cons("ConstructorDeclaration")}
    ";"							      -> ClassBodyDeclaration {cons("semicolon11")}
    ClassDeclaration					      -> ClassBodyDeclaration {cons("ClassDeclaration1")}
    FieldDeclaration					      -> ClassMemberDeclaration {cons("FieldDeclaration1")}
    MethodDeclaration					      -> ClassMemberDeclaration {cons("MethodDeclaration")}
    "static" Block					      -> StaticInitializer {cons("static1")}
    InterfaceDeclaration				      -> ClassBodyDeclaration {cons("ClassDeclaration2")}
    Block						      -> ClassMemberDeclaration {cons("BlockClassMember")}