Module compilation unit grammar
Mandy Chung
mandy.chung at oracle.com
Fri Apr 1 15:33:51 PDT 2011
Adding to Jon's question:
export p.*;
Does '*' match '.' in the package name? If not, it'd be useful to
support '**' like syntax e.g. 'export java.**;' exports all package
names with 'java.' prefix.
Mandy
On 4/1/11 3:05 PM, Jonathan Gibbons wrote:
> 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