2014-10-11 11 views
5

Podczas gdy gramatyka Java wydaje się bardzo dokładnie opisana w specyfikacjach JLS, istnieją pewne konkretne przypadki, których nie stosuję w podanych definicjach.Kompletność definicji gramatyki języka Java

Na przykład, biorąc ClassInstanceCreationExpression reguły w rozdziale 15.9 z JLS8, niekwalifikowanych new wyrażeniach powinny mieć postać:

new [TypeArguments] {Annotation} Identifier [TypeArgumentsOrDiamond] ([ArgumentList]) [ClassBody] 

Identifier będącego standardem identyfikator Java (głównie Java litery/cyfry, nie dot).

Jak ta definicja ma zastosowanie do ważnych wyrażeń takich jak statyczne zagnieżdżonych klas instanciation:

new C1.C2(); 

lub pakiet wykwalifikowanych klas instanciation:

new java.lang.String("foo"); 

danej że kropki nie może być częścią Identifier?

Należy zauważyć, że nastąpiła zmiana na tej definicji od JLS7 do JLS8, gdzie JLS7 został stwierdzające, dla niekwalifikowanych new wyrażeń:

new [TypeArguments] TypeDeclSpecifier [TypeArgumentsOrDiamond]([ArgumentList]) [ClassBody] 

TypeDeclSpecifier jest zdefiniowany jako:

TypeDeclSpecifier: 
    TypeName 
    ClassOrInterfaceType . Identifier 

pozwalając niekwalifikowane wyrażenia new dla klas zagnieżdżonych statycznych i klas o kwalifikacjach pakietowych.

Odpowiedz

5

Wydaje się być bug w specyfikacji.

Cytowanie w raporcie błędów związanych z powyżej (trzeci punkt w opisie):

  1. gramatykę nie określa żadnej produkcji na następującym wyrażeniem: new javy .security.Permissions()

jest to efektem ubocznym usuwania TypeDeclSpecifier w 4.3, jak to interakcje typu słabo z opisów. Publiczny raport JSR 308 zauważył: "TypeDeclSpecifier jest jednym z mniej znanych nieterminali w specyfikacji języka Java, który jest używany tylko w kilku sytuacjach: rozszerza i implementuje klauzule deklaracji klasy (8.1.4, 8.1.5), rozszerza klauzulę deklaracji interfejsu (9.1.3) i składnia wyrażenia tworzenia instancji klasy (15.9). Powodem jego użycia jest zakazanie argumentów typu wieloznacznego (chociaż 9.1.3 w rzeczywistości tego nie robi) , ale można to osiągnąć równie dobrze bez dedykowanego non-terminala. "

Powiązane problemy