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