module languages/java/syntax/Java

imports languages/java/syntax/ClassDecl 
imports languages/java/syntax/ConstructorDecl 
imports languages/java/syntax/FieldDecl 
imports languages/java/syntax/MethodDecl 
imports languages/java/syntax/Statements 
imports languages/java/syntax/Comment

exports
  context-free start-symbols CompilationUnit

  sorts CompilationUnit File TypeDeclaration TypeImportOnDemandDeclaration SingleTypeImportDeclaration ImportDeclaration PackageDeclaration FileHeader

  lexical syntax
    "FILE:" ~[\n]* "\n" -> FileHeader

  context-free syntax
    FileHeader CompilationUnit -> File {cons("file-with-header")}

  context-free syntax
    PackageDeclaration? ImportDeclaration* TypeDeclaration+ -> CompilationUnit {prefer,cons("PackageDeclaration-opt-ImportDeclaration-s-TypeDeclaration-s")}
    "package" Name ";" -> PackageDeclaration {cons("package-semicolon")}
    SingleTypeImportDeclaration -> ImportDeclaration {cons("SingleTypeImportDeclaration")}
    TypeImportOnDemandDeclaration -> ImportDeclaration {cons("TypeImportOnDemandDeclaration")}
    "import" Name ";" -> SingleTypeImportDeclaration {cons("import-semicolon")}
    "import" Name "." "*" ";" -> TypeImportOnDemandDeclaration {cons("import-times-semicolon")}
    ClassDeclaration -> TypeDeclaration {cons("ClassDeclaration11")}
    InterfaceDeclaration -> TypeDeclaration {cons("InterfaceDeclaration")}
    ";" -> TypeDeclaration {cons("semicolon5")}