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