Module compilation unit grammar

Jonathan Gibbons jonathan.gibbons at oracle.com
Fri Apr 1 15:05:21 PDT 2011


Is the asterisk form of export constrained to packages and/or is it 
required for packages?

For example, which of the following are valid

     export p;
     export p.*;
     export p.Clazz;
     export p.Clazz.*;

-- Jon


On 03/11/2011 03:51 PM, Alex Buckley wrote:
> Here is the current grammar used by javac to parse a module 
> compilation unit ("module-info.java").
>
>
> * Example
>
> module a.b @ 1.0 {
>   require c.d @ [2.0,3.0);
>   export  e.f.*;
>   provide g.h @ 4.0;
>   permit  i.j;
>   class   k.l;
> }
>
> - A compilation unit may contain a module declaration.
>
> - A module declaration may not be annotated.
>
> - A module name is a qualified identifier, in the spirit of a 
> package-or-type name and a type name (JLS3 6.5).
>
> - A module version is like a qualified identifier, except that the 
> characters of the identifier may be any Java letter or digit (to allow 
> a first numeric character) and the qualifier may be .+-:~ (as per 
> http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version, 
> referred to by org/openjdk/jigsaw/JigsawVersion.java).
>
> - require takes a qualified identifier indicating a module name, 
> optionally followed by '@' and a version query. A version query is an 
> exact version or an interval.
>
> - require supports 'local' and 'optional' flags. There is no 'public' 
> flag because re-export is handled by the export statement.
>
> - export takes a qualified identifier indicating a package or type 
> name, possibly ending in '. *'.
>
> - permit takes a qualified identifier indicating a module name.
>
> - class takes a qualified identifier indicating a type name.
>
> - require/local/optional/export/provide/permit are restricted keywords.
>
>
> * Grammar
>
> [x] denotes zero or one occurrences of x.
> {x} denotes zero or more occurrences of x.
> (x|y) means one of either x or y.
>
>
> CompilationUnit:
>   [PackageDeclaration] [ImportDeclaration] [TypeDeclaration]
>   [ModuleDeclaration]
>
> ModuleDeclaration:
>   'module' ModuleName ['@' Version] '{' {ModuleStatement} '}'
>
> ModuleName:
>   Identifier
>   ModuleName '.' Identifier
>
> ModuleStatement:
>   ModuleRequire
>   ModuleProvide
>   ModuleExport
>   ModulePermit
>   ModuleClass
>
> ModuleRequire:
>   'require' [ModuleRequireModifier] ModuleName ['@' VersionQuery] ';'
>
> ModuleRequireModifier:
>   'local'
>   'optional'
>
> ModuleExport:
>   'export' PackageOrTypeName ['.' '*'] ';'
>
> ModuleProvide:
>   'provide' ModuleName ['@' Version] ';'
>
> ModulePermit:
>   'permit' ModuleName ';'
>
> ModuleClass:
>   'class' TypeName ';'
>
> VersionQuery:
>   Version
>   ('['|'(') Version ',' Version (')'|']')
>
> Version:
>   ModuleIdentifier {VersionTokenizer ModuleIdentifier}
>
> ModuleIdentifier:
>   JavaLetterOrDigit
>   ModuleIdentifier JavaLetterOrDigit
>
> VersionTokenizer:
>   . or + or - or : or ~
>




More information about the jigsaw-dev mailing list