Spec-Zone.ru › Java Language Specification 7

Глава 18. Синтаксис

В этой главе представлена грамматика языка программирования Java.

Грамматика, представленная частями в предыдущих главах (§2.3), намного лучше подходит для изложения, но она не подходит в качестве основы для парсера. Грамматика, представленная в этой главе, является основой для эталонной реализации. Обратите внимание, что это не грамматика LL(1), хотя во многих случаях она минимизирует необходимый просмотр вперёд.

Нижеприведенная грамматика использует следующие соглашения в стиле BNF:

  • [x] обозначает ноль или одно вхождение x.

  • {x} обозначает ноль или более вхождений x.

  • (x | y) означает одно из x или y.


Идентификатор:
IDENTIFIER

КвалифицированныйИдентификатор:
Identifier { . Identifier }

СписокКвалифицированныхИдентификаторов:
QualifiedIdentifier { , QualifiedIdentifier }


CompilationUnit:
[[Annotations] package QualifiedIdentifier ;]
{ImportDeclaration} {TypeDeclaration}

ImportDeclaration:
import [static] Identifier { . Identifier } [. *] ;

TypeDeclaration:
ClassOrInterfaceDeclaration
;

ClassOrInterfaceDeclaration:
{Modifier} (ClassDeclaration | InterfaceDeclaration)

ClassDeclaration:
NormalClassDeclaration
EnumDeclaration

InterfaceDeclaration:
NormalInterfaceDeclaration
AnnotationTypeDeclaration



NormalClassDeclaration:
class Identifier [TypeParameters]
[extends Type] [implements TypeList] ClassBody

EnumDeclaration:
enum Identifier [implements TypeList] EnumBody

NormalInterfaceDeclaration:
interface Identifier [TypeParameters] [extends TypeList] InterfaceBody

AnnotationTypeDeclaration:
@ interface Identifier AnnotationTypeBody


Тип:
BasicType {[]}
ReferenceType {[]}

BasicType:
byte
short
char
int
long
float
double
boolean

ReferenceType:
Identifier [TypeArguments] { . Identifier [TypeArguments] }

TypeArguments:
< TypeArgument { , TypeArgument } >

TypeArgument:
ReferenceType
? [ (extends | super) ReferenceType ]


NonWildcardTypeArguments:
< TypeList >

TypeList:
ReferenceType { , ReferenceType }



TypeArgumentsOrDiamond:
< >
TypeArguments

NonWildcardTypeArgumentsOrDiamond:
< >
NonWildcardTypeArguments



TypeParameters:
< TypeParameter { , TypeParameter } >

TypeParameter:
Identifier [extends Bound]

Bound:
ReferenceType { & ReferenceType }


Модификатор:
Annotation
public
protected
private
static
abstract
final
native
synchronized
transient
volatile
strictfp

Annotations:
Annotation {Annotation}

Annotation:
@ QualifiedIdentifier [ ( [AnnotationElement] ) ]

AnnotationElement:
ElementValuePairs
ElementValue

ElementValuePairs:
ElementValuePair { , ElementValuePair }

ElementValuePair:
Identifier = ElementValue

ElementValue:
Annotation
Expression1
ElementValueArrayInitializer

ElementValueArrayInitializer:
{ [ElementValues] [,] }

ElementValues:
ElementValue { , ElementValue }


ClassBody:
{ { ClassBodyDeclaration } }

ClassBodyDeclaration:
;
{Modifier} MemberDecl
[static] Block

MemberDecl:
MethodOrFieldDecl
void Identifier VoidMethodDeclaratorRest
Identifier ConstructorDeclaratorRest
GenericMethodOrConstructorDecl
ClassDeclaration
InterfaceDeclaration

MethodOrFieldDecl:
Type Identifier MethodOrFieldRest

MethodOrFieldRest:
FieldDeclaratorsRest ;
MethodDeclaratorRest

FieldDeclaratorsRest:
VariableDeclaratorRest { , VariableDeclarator }

MethodDeclaratorRest:
FormalParameters {[]} [throws QualifiedIdentifierList] (Block | ;)

VoidMethodDeclaratorRest:
FormalParameters [throws QualifiedIdentifierList] (Block | ;)

ConstructorDeclaratorRest:
FormalParameters [throws QualifiedIdentifierList] Block

GenericMethodOrConstructorDecl:
TypeParameters GenericMethodOrConstructorRest

GenericMethodOrConstructorRest:
(Type | void) Identifier MethodDeclaratorRest
Identifier ConstructorDeclaratorRest


InterfaceBody:
{ { InterfaceBodyDeclaration } }

InterfaceBodyDeclaration:
;
{Modifier} InterfaceMemberDecl

InterfaceMemberDecl:
InterfaceMethodOrFieldDecl
void Identifier VoidInterfaceMethodDeclaratorRest
InterfaceGenericMethodDecl
ClassDeclaration
InterfaceDeclaration

InterfaceMethodOrFieldDecl:
Type Identifier InterfaceMethodOrFieldRest

InterfaceMethodOrFieldRest:
ConstantDeclaratorsRest ;
InterfaceMethodDeclaratorRest

ConstantDeclaratorsRest:
ConstantDeclaratorRest { , ConstantDeclarator }

ConstantDeclaratorRest:
{[]} = VariableInitializer

ConstantDeclarator:
Identifier ConstantDeclaratorRest

InterfaceMethodDeclaratorRest:
FormalParameters {[]} [throws QualifiedIdentifierList] ;

VoidInterfaceMethodDeclaratorRest:
FormalParameters [throws QualifiedIdentifierList] ;

InterfaceGenericMethodDecl:
TypeParameters (Type | void) Identifier InterfaceMethodDeclaratorRest


FormalParameters:
( [FormalParameterDecls] )

FormalParameterDecls:
{VariableModifier} Type FormalParameterDeclsRest

VariableModifier:
final
Annotation

FormalParameterDeclsRest:
VariableDeclaratorId [, FormalParameterDecls]
... VariableDeclaratorId



VariableDeclaratorId:
Identifier {[]}



VariableDeclarators:
VariableDeclarator { , VariableDeclarator }

VariableDeclarator:
Identifier VariableDeclaratorRest

VariableDeclaratorRest:
{[]} [ = VariableInitializer ]

VariableInitializer:
ArrayInitializer
Expression

ArrayInitializer:
{ [ VariableInitializer { , VariableInitializer } [,] ] }


Block:
{ BlockStatements }

BlockStatements:
{ BlockStatement }

BlockStatement:
LocalVariableDeclarationStatement
ClassOrInterfaceDeclaration
[Identifier :] Statement

LocalVariableDeclarationStatement:
{ VariableModifier } Type VariableDeclarators ;

Statement:
Block
;
Identifier : Statement
StatementExpression ;
if ParExpression Statement [else Statement]
assert Expression [: Expression] ;
switch ParExpression { SwitchBlockStatementGroups }
while ParExpression Statement
do Statement while ParExpression ;
for ( ForControl ) Statement
break [Identifier] ;
continue [Identifier] ;
return [Expression] ;
throw Expression ;
synchronized ParExpression Block
try Block (Catches | [Catches] Finally)
try ResourceSpecification Block [Catches] [Finally]

StatementExpression:
Expression

END_OF_DOCUMENT_MARKER


Ловятся:
CatchClause { CatchClause }

CatchClause:
catch ( {VariableModifier} ТипИсключения Идентификатор ) Блок

ТипИсключения:
КвалифицированныйИдентификатор { | КвалифицированныйИдентификатор }

Finally:
finally Блок

СпецификацияРесурсов:
( Ресурсы [;] )

Ресурсы:
Ресурс { ; Ресурс }

Ресурс:
{VariableModifier} ТипСсылка ПеременнаяДеклараторId = Выражение


SwitchBlockStatementGroups:
{ SwitchBlockStatementGroup }

SwitchBlockStatementGroup:
SwitchLabels BlockStatements

SwitchLabels:
SwitchLabel { SwitchLabel }

SwitchLabel:
case Выражение :
case ИмяПеречисления :
default :

ИмяПеречисления:
Идентификатор



ForControl:
ForVarControl
ForInit ; [Выражение] ; [ForUpdate]

ForVarControl:
{VariableModifier} Тип ПеременнаяДеклараторId ForVarControlRest

ForVarControlRest:
ForVariableDeclaratorsRest ; [Выражение] ; [ForUpdate]
: Выражение

ForVariableDeclaratorsRest:
[= ИнициализаторПеременной] { , ДеклараторПеременной }

ForInit:
ForUpdate:
StatementExpression { , StatementExpression }


Выражение:
Выражение1 [ОператорПрисваивания Выражение1]

ОператорПрисваивания:
=
+=
-=
*=
/=
&=
|=
^=
%=
<<=
>>=
>>>=

Выражение1:
Выражение2 [Выражение1Rest]

Выражение1Rest:
? Выражение : Выражение1

Выражение2:
Выражение3 [Выражение2Rest]

Выражение2Rest:
{ ОператорИнфикс Выражение3 }
instanceof Тип


ОператорИнфикс:
||
&&
|
^
&
==
!=
<
>
<=
>=
<<
>>
>>>
+
-
*
/
%

Выражение3:
ОператорПрефикс Выражение3
( (Выражение | Тип) ) Выражение3
Первичное { Селектор } { ОператорПостфикс }

ОператорПрефикс:
++
--
!
~
+
-

ОператорПостфикс:
++
--


Первичное:
Литерал
ParExpression
this [Аргументы]
super СуффиксСупер
new Создатель
NonWildcardTypeArguments (ExplicitGenericInvocationSuffix | this Аргументы)
Идентификатор { . Идентификатор } [СуффиксИдентификатора]
БазовыйТип {[]} . class
void . class



Литерал:
ЦелочисленныйЛитерал
ВещественныйЛитерал
СимвольныйЛитерал
СтроковыйЛитерал
БулевыйЛитерал
NullЛитерал

ParExpression:
( Выражение )

Аргументы:
( [ Выражение { , Выражение } ] )

СуффиксСупер:
Аргументы
. Идентификатор [Аргументы]

ExplicitGenericInvocationSuffix:
super СуффиксСупер
Идентификатор Аргументы


Создатель:
NonWildcardTypeArguments ИмяСоздаваемого КлассСоздательОстаток
ИмяСоздаваемого (КлассСоздательОстаток | МассивСоздательОстаток)

ИмяСоздаваемого:
Идентификатор [АргументыТиповИлиАлмаз] { . Идентификатор [АргументыТиповИлиАлмаз] }

КлассСоздательОстаток:
Аргументы [ТелоКласса]

МассивСоздательОстаток:
[ (] {[]} ИнициализаторМассива | Выражение ] {[ Выражение ]} {[]})



СуффиксИдентификатора:
[ ({[]} . class | Выражение) ]
Аргументы
. (class | ExplicitGenericInvocation | this | super Аргументы |
new [NonWildcardTypeArguments] ВложенныйСоздатель)

ExplicitGenericInvocation:
NonWildcardTypeArguments ExplicitGenericInvocationSuffix

ВложенныйСоздатель:
Идентификатор [NonWildcardTypeArgumentsOrDiamond] КлассСоздательОстаток



Селектор:
. Идентификатор [Аргументы]
. ExplicitGenericInvocation
. this
. super СуффиксСупер
. new [NonWildcardTypeArguments] ВложенныйСоздатель
[ Выражение ]


ТелоПеречисления:
{ [ПостоянныеПеречисления] [,] [ДекларацииТелаПеречисления] }

ПостоянныеПеречисления:
ПостоянноеПеречисление
ПостоянныеПеречисления , ПостоянноеПеречисление

ПостоянноеПеречисление:
[Аннотации] Идентификатор [Аргументы] [ТелоКласса]

ДекларацииТелаПеречисления:
; {ДекларацияТелаКласса}



ТелоТипаАннотации:
{ [ДекларацииЭлементовТипаАннотации] }

ДекларацииЭлементовТипаАннотации:
ДекларацияЭлементаТипаАннотации
ДекларацииЭлементовТипаАннотации ДекларацияЭлементаТипаАннотации

ДекларацияЭлементаТипаАннотации:
{Модификатор} ДекларацияЭлементаОстаток

ДекларацияЭлементаОстаток:
Тип Идентификатор МетодИлиПостояннаяАннотацииОстаток ;
ОбъявлениеКласса
ОбъявлениеИнтерфейса
ОбъявлениеПеречисления
ОбъявлениеТипаАннотации

МетодИлиПостояннаяАннотацииОстаток:
МетодАннотацииОстаток
ОстатокДеклараторовПостоянных

МетодАннотацииОстаток:
( ) [[]] [default ЗначениеЭлемента]

© Oracle and/or its affiliates. All rights reserved.
Licensed under the Oracle Technology Network License Agreement.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API