Module compilation unit grammar

Alex Buckley alex.buckley at oracle.com
Fri Mar 11 15:51:50 PST 2011


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