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