Глава 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
Ловятся:
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.