Spec-Zone .ru
спецификации, руководства, описания, API
|
ГЛАВА 19
Эта глава представляет грамматику для Java. Грамматика была механически проверена, чтобы обеспечить, чтобы это был LALR (1).
Грамматика для Java, представленного по частям в предыдущих главах, намного лучше для выставки, но это не может быть проанализировано слева направо с одним маркером предвидения из-за определенных синтаксических особенностей, некоторые из них наследованный от C и C++. Эти проблемы и решения, принятые для LALR (1) грамматика, представляются ниже, сопровождаются грамматикой непосредственно.
PackageName:и:
Identifier
PackageName.
Identifier TypeName:
Identifier
PackageName.
Identifier
MethodName:Теперь рассмотрите частичный ввод:
Identifier
AmbiguousName.
Identifier AmbiguousName:
Identifier
AmbiguousName.
Identifier
class Problem1 { int m() { hayden.Когда синтаксический анализатор рассматривает маркер
hayden
, с предвидением с одним маркером к символу".
", это еще не может сказать ли hayden
должен быть PackageName, который квалифицирует имя типа, как в: hayden.Dinosaur rex = new hayden.Dinosaur(2);или AmbiguousName, который квалифицирует имя метода, как в:
hayden.print("Dinosaur Rex!");Поэтому, производство, показанное выше результата в грамматике, которая не является LALR (1). Есть также другие проблемы с рисованием различий среди различных видов имен в грамматике.
Решение состоит в том, чтобы устранить нетерминалы PackageName, TypeName, ExpressionName, MethodName, и AmbiguousName, заменяя их всех единственным нетерминальным Именем:
Name:Более поздний этап компиляторного анализа тогда разбирается в точной роли каждого имени или спецификатора имени.
SimpleName
QualifiedName SimpleName:
Identifier QualifiedName:
Name.
Identifier
По связанным причинам, этому производству в §4.3:
ClassOrInterfaceType:были изменены на:
ClassType
InterfaceType ClassType:
TypeName InterfaceType:
TypeName
ClassOrInterfaceType:
Name ClassType:
ClassOrInterfaceType InterfaceType:
ClassOrInterfaceType
FieldDeclaration:и:
FieldModifiersoptType
VariableDeclarators
;
FieldModifiers:
FieldModifier
FieldModifiersFieldModifier FieldModifier: one of
public
protected
private
final static transient volatile
MethodHeader:Теперь рассмотрите частичный ввод:
MethodModifiersoptResultType
MethodDeclarator
Throwsopt MethodModifiers:
MethodModifier
MethodModifiersMethodModifier MethodModifier: one of
public
protected
private
static
abstract final native synchronized
class Problem2 { public static intКогда синтаксический анализатор рассматривает маркер
static
, с предвидением с одним маркером к символу int
- или, хуже все же, рассматривая маркер public
с предвидением к static
- это еще не может сказать, будет ли это полевым объявлением, таким как: public static int maddie = 0;или объявление метода, такое как:
public static int maddie(String art) { return art.length(); }Поэтому, синтаксический анализатор не может сказать с только предвидением с одним маркером ли
static
(или, точно так же public
) должен быть уменьшен до FieldModifier или MethodModifier. Поэтому, производство, показанное выше результата в грамматике, которая не является LALR (1). Есть также другие проблемы с рисованием различий среди различных видов модификаторов в грамматике. В то время как не все контексты вызывают проблему, самое простое решение состоит в том, чтобы объединить все контексты, в которых такие модификаторы используются, устраняя все шесть из нетерминалов ClassModifiers (§8.1.2), FieldModifiers (§8.3.1), MethodModifiers (§8.4.3), ConstructorModifiers (§8.6.3), InterfaceModifiers (§9.1.2), и ConstantModifiers (§9.3) от грамматики, заменяя их всех с синглом нетерминальные Модификаторы:
Modifiers:Более поздний этап компиляторного анализа тогда разбирается в точной роли каждого модификатора и разрешается ли это в данном контексте.
Modifier
ModifiersModifier Modifier: one of
public protected private
static
abstract final native synchronized transient volatile
FieldDeclaration:и:
ModifiersoptType
VariableDeclarators
;
MethodHeader:где ResultType определяется как:
ModifiersoptResultType
MethodDeclarator
Throwsopt
ResultType:Теперь рассмотрите частичный ввод:
Type
void
class Problem3 { int julieОтметьте, что в этом простом примере никакие Модификаторы не присутствуют. Когда синтаксический анализатор рассматривает маркер
int
, с предвидением с одним маркером к символу julie
, это еще не может сказать, будет ли это полевым объявлением, таким как: int julie = 14;или объявление метода, такое как:
int julie(String art) { return art.length(); }Поэтому, после того, как синтаксический анализатор уменьшает
int
к нетерминальному Типу это не может сказать с только предвидением с одним маркером, должен ли Тип быть далее уменьшен до ResultType (для объявления метода) или оставлен в покое (для полевого объявления). Поэтому, производство, показанное выше результата в грамматике, которая не является LALR (1). Решение состоит в том, чтобы устранить производство ResultType и иметь отдельные альтернативы для MethodHeader:
MethodHeader:Это позволяет синтаксическому анализатору уменьшать
ModifiersoptType
MethodDeclarator
Throwsopt
Modifiersoptvoid
MethodDeclaratorThrowsopt
int
Ввести и затем оставить это, как, задерживая решение относительно того, происходят ли полевое объявление или объявление метода.ArrayType:и:
Type
[ ]
ArrayAccess:Теперь рассмотрите частичный ввод:
Name[
Expression]
PrimaryNoNewArray
[
Expression]
class Problem4 { Problem4() { peter[Когда синтаксический анализатор рассматривает маркер
peter
, с предвидением с одним маркером к символу [
, это еще не может сказать ли peter
будет часть имени типа, как в: peter[] team;или часть доступа массива, как в:
peter[3] = 12;Поэтому, после того, как синтаксический анализатор уменьшает
peter
к нетерминальному Имени это не может сказать с только предвидением с одним маркером, должно ли Имя быть уменьшено в конечном счете, чтобы Ввести (для типа массива) или оставлено в покое (для доступа массива). Поэтому, производство, показанное выше результата в грамматике, которая не является LALR (1). Решение состоит в том, чтобы иметь отдельные альтернативы для ArrayType:
ArrayType:Это позволяет синтаксическому анализатору уменьшать
PrimitiveType
[ ]
Name
[ ]
ArrayType
[ ]
peter
Назвать и затем оставить это, как, задерживая решение относительно того, происходят ли тип массива или доступ массива. CastExpression:Теперь рассмотрите частичный ввод:
(
PrimitiveType)
UnaryExpression
(
ReferenceType)
UnaryExpressionNotPlusMinus
class Problem5 { Problem5() { super((matthew)Когда синтаксический анализатор рассматривает маркер
matthew
, с предвидением с одним маркером к символу )
, это еще не может сказать ли (matthew)
будет заключенное в скобки выражение, как в: super((matthew), 9);или бросок, как в:
super((matthew)baz, 9);Поэтому, после того, как синтаксический анализатор уменьшает
matthew
к нетерминальному Имени это не может сказать с только предвидением с одним маркером, должно ли Имя быть далее уменьшено до PostfixExpression и в конечном счете до Выражения (для заключенного в скобки выражения) или к ClassOrInterfaceType и затем к ReferenceType (для броска). Поэтому, производство, показанное выше результата в грамматике, которая не является LALR (1). Решение состоит в том, чтобы устранить использование нетерминального ReferenceType в определении CastExpression, который требует, чтобы некоторая переделка обеих альтернатив избежала других неоднозначностей:
CastExpression:Это позволяет синтаксическому анализатору уменьшать
(
PrimitiveTypeDimsopt
)
UnaryExpression
(
Expression)
UnaryExpressionNotPlusMinus
(
NameDims
)
UnaryExpressionNotPlusMinus
matthew
к Выражению и затем оставляют это там, задерживая решение относительно того, происходят ли заключенное в скобки выражение или бросок. Несоответствующие разновидности, такие как: (int[])+3и:
(matthew+1)bazдолжен тогда быть избавлен и отклонен более поздним этапом компиляторного анализа.
Остающиеся разделы этой главы составляют LALR (1) грамматика для синтаксиса Java, в котором выше были решены эти пять проблем, описанных.
Goal:
CompilationUnit
Literal:
IntegerLiteral
FloatingPointLiteral
BooleanLiteral
CharacterLiteral
StringLiteral
NullLiteral
Type:
PrimitiveType
ReferenceType PrimitiveType:
NumericType
boolean
NumericType:
IntegralType
FloatingPointType IntegralType: one of
byte short int long char
FloatingPointType: one of
float double
ReferenceType:
ClassOrInterfaceType
ArrayType ClassOrInterfaceType:
Name ClassType:
ClassOrInterfaceType InterfaceType:
ClassOrInterfaceType ArrayType:
PrimitiveType
[ ]
Name
[ ]
ArrayType
[ ]
Name:
SimpleName
QualifiedName SimpleName:
Identifier QualifiedName:
Name.
Identifier
CompilationUnit:
PackageDeclarationoptImportDeclarationsopt
TypeDeclarationsopt ImportDeclarations:
ImportDeclaration
ImportDeclarationsImportDeclaration TypeDeclarations:
TypeDeclaration
TypeDeclarationsTypeDeclaration PackageDeclaration:
package
Name;
ImportDeclaration:
SingleTypeImportDeclaration
TypeImportOnDemandDeclaration SingleTypeImportDeclaration:
import
Name;
TypeImportOnDemandDeclaration:
import
Name. * ;
TypeDeclaration:
ClassDeclaration
InterfaceDeclaration
;
Modifiers:
Modifier
ModifiersModifier Modifier: one of
public protected private
static
abstract final native synchronized transient volatile
ClassDeclaration:
Modifiersoptclass
IdentifierSuperopt
Interfacesopt
ClassBody Super:
extends
ClassType Interfaces:
implements
InterfaceTypeList InterfaceTypeList:
InterfaceType
InterfaceTypeList,
InterfaceType ClassBody:
{
ClassBodyDeclarationsopt}
ClassBodyDeclarations:
ClassBodyDeclaration
ClassBodyDeclarationsClassBodyDeclaration ClassBodyDeclaration:
ClassMemberDeclaration
StaticInitializer
ConstructorDeclaration ClassMemberDeclaration:
FieldDeclaration
MethodDeclaration
FieldDeclaration:
ModifiersoptType
VariableDeclarators
;
VariableDeclarators:
VariableDeclarator
VariableDeclarators,
VariableDeclarator VariableDeclarator:
VariableDeclaratorId
VariableDeclaratorId=
VariableInitializer VariableDeclaratorId:
Identifier
VariableDeclaratorId[ ]
VariableInitializer:
Expression
ArrayInitializer
MethodDeclaration:
MethodHeaderMethodBody MethodHeader:
ModifiersoptType
MethodDeclarator
Throwsopt
Modifiersoptvoid
MethodDeclaratorThrowsopt MethodDeclarator:
Identifier(
FormalParameterListopt)
MethodDeclarator
[ ]
FormalParameterList:
FormalParameter
FormalParameterList,
FormalParameter FormalParameter:
TypeVariableDeclaratorId Throws:
throws
ClassTypeList ClassTypeList:
ClassType
ClassTypeList,
ClassType MethodBody:
Block
;
StaticInitializer:
static
Block
ConstructorDeclaration:
ModifiersoptConstructorDeclarator
Throwsopt
ConstructorBody ConstructorDeclarator:
SimpleName
(
FormalParameterListopt)
ConstructorBody:
{
ExplicitConstructorInvocationoptBlockStatementsopt
}
ExplicitConstructorInvocation:
this (
ArgumentListopt) ;
super (
ArgumentListopt) ;
InterfaceDeclaration:
Modifiersoptinterface
IdentifierExtendsInterfacesopt
InterfaceBody ExtendsInterfaces:
extends
InterfaceType
ExtendsInterfaces,
InterfaceType InterfaceBody:
{
InterfaceMemberDeclarationsopt}
InterfaceMemberDeclarations:
InterfaceMemberDeclaration
InterfaceMemberDeclarationsInterfaceMemberDeclaration InterfaceMemberDeclaration:
ConstantDeclaration
AbstractMethodDeclaration ConstantDeclaration:
FieldDeclaration AbstractMethodDeclaration:
MethodHeader;
ArrayInitializer:
{
VariableInitializersopt,
opt}
VariableInitializers:
VariableInitializer
VariableInitializers,
VariableInitializer
Block:
{
BlockStatementsopt}
BlockStatements:
BlockStatement
BlockStatements
BlockStatement BlockStatement:
LocalVariableDeclarationStatement
Statement LocalVariableDeclarationStatement:
LocalVariableDeclaration;
LocalVariableDeclaration:
TypeVariableDeclarators Statement:
StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement StatementNoShortIf:
StatementWithoutTrailingSubstatement
LabeledStatementNoShortIf
IfThenElseStatementNoShortIf
WhileStatementNoShortIf
ForStatementNoShortIf StatementWithoutTrailingSubstatement:
Block
EmptyStatement
ExpressionStatement
SwitchStatement
DoStatement
BreakStatement
ContinueStatement
ReturnStatement
SynchronizedStatement
ThrowStatement
TryStatement EmptyStatement:
;
LabeledStatement:
Identifier:
Statement LabeledStatementNoShortIf:
Identifier:
StatementNoShortIf ExpressionStatement:
StatementExpression;
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
IfThenStatement:
if (
Expression)
Statement IfThenElseStatement:
if (
Expression)
StatementNoShortIfelse
Statement IfThenElseStatementNoShortIf:
if (
Expression)
StatementNoShortIfelse
StatementNoShortIf SwitchStatement:
switch (
Expression)
SwitchBlock SwitchBlock:
{
SwitchBlockStatementGroupsoptSwitchLabelsopt
}
SwitchBlockStatementGroups:
SwitchBlockStatementGroup
SwitchBlockStatementGroups
SwitchBlockStatementGroup SwitchBlockStatementGroup:
SwitchLabelsBlockStatements SwitchLabels:
SwitchLabel
SwitchLabelsSwitchLabel SwitchLabel:
case
ConstantExpression:
WhileStatement:
default :
while (
Expression)
Statement WhileStatementNoShortIf:
while (
Expression)
StatementNoShortIf DoStatement:
do
Statementwhile (
Expression) ;
ForStatement:
for (
ForInitopt;
Expressionopt;
ForUpdateopt)
Statement ForStatementNoShortIf:
for (
ForInitopt;
Expressionopt;
ForUpdateopt)
StatementNoShortIf ForInit:
StatementExpressionList
LocalVariableDeclaration ForUpdate:
StatementExpressionList StatementExpressionList:
StatementExpression
StatementExpressionList,
StatementExpression BreakStatement:
break
Identifieropt;
ContinueStatement:
continu
e Identifieropt;
ReturnStatement:
return
Expressionopt;
ThrowStatement:
throw
Expression;
SynchronizedStatement:
synchronized (
Expression)
Block TryStatement:
try
BlockCatches
try
BlockCatchesopt
Finally Catches:
CatchClause
CatchesCatchClause CatchClause:
catch (
FormalParameter)
Block Finally:
finally
Block
Primary:
PrimaryNoNewArray
ArrayCreationExpression PrimaryNoNewArray:
Literal
this
(
Expression)
ClassInstanceCreationExpression
FieldAccess
MethodInvocation
ArrayAccess ClassInstanceCreationExpression:
new
ClassType(
ArgumentListopt)
ArgumentList:
Expression
ArgumentList,
Expression ArrayCreationExpression:
new
PrimitiveTypeDimExprs
Dimsopt
new
ClassOrInterfaceTypeDimExprs
Dimsopt DimExprs:
DimExpr
DimExprsDimExpr DimExpr:
[
Expression]
Dims:
[ ]
Dims
[ ]
FieldAccess:
Primary.
Identifier
super .
Identifier MethodInvocation:
Name(
ArgumentListopt)
Primary
.
Identifier(
ArgumentListopt)
Identifier
super .(
ArgumentListopt)
ArrayAccess:
Name[
Expression]
PrimaryNoNewArray
[
Expression]
PostfixExpression:
Primary
Name
PostIncrementExpression
PostDecrementExpression PostIncrementExpression:
PostfixExpression++
PostDecrementExpression:
PostfixExpression--
UnaryExpression:
PreIncrementExpression
PreDecrementExpression
+
UnaryExpression
-
UnaryExpression
UnaryExpressionNotPlusMinus PreIncrementExpression:
++
UnaryExpression PreDecrementExpression:
--
UnaryExpression UnaryExpressionNotPlusMinus:
PostfixExpression
~
UnaryExpression
!
UnaryExpression
CastExpression CastExpression:
(
PrimitiveTypeDimsopt
)
UnaryExpression
(
Expression)
UnaryExpressionNotPlusMinus
(
NameDims
)
UnaryExpressionNotPlusMinus MultiplicativeExpression:
UnaryExpression
MultiplicativeExpression*
UnaryExpression
MultiplicativeExpression/
UnaryExpression
MultiplicativeExpression%
UnaryExpression AdditiveExpression:
MultiplicativeExpression
AdditiveExpression+
MultiplicativeExpression
AdditiveExpression
-
MultiplicativeExpression ShiftExpression:
AdditiveExpression
ShiftExpression<<
AdditiveExpression
ShiftExpression>>
AdditiveExpression
ShiftExpression>>>
AdditiveExpression RelationalExpression:
ShiftExpression
RelationalExpression<
ShiftExpression
RelationalExpression>
ShiftExpression
RelationalExpression<=
ShiftExpression
RelationalExpression>=
ShiftExpression
RelationalExpressioninstanceof
ReferenceType EqualityExpression:
RelationalExpression
EqualityExpression==
RelationalExpression
EqualityExpression!=
RelationalExpression AndExpression:
EqualityExpression
AndExpression&
EqualityExpression ExclusiveOrExpression:
AndExpression
ExclusiveOrExpression^
AndExpression InclusiveOrExpression:
ExclusiveOrExpression
InclusiveOrExpression|
ExclusiveOrExpression ConditionalAndExpression:
InclusiveOrExpression
ConditionalAndExpression&&
InclusiveOrExpression ConditionalOrExpression:
ConditionalAndExpression
ConditionalOrExpression||
ConditionalAndExpression ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression?
Expression:
ConditionalExpression AssignmentExpression:
ConditionalExpression
Assignment Assignment:
LeftHandSideAssignmentOperator
AssignmentExpression LeftHandSide:
Name
FieldAccess
ArrayAccess AssignmentOperator: one of
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Expression:
AssignmentExpression ConstantExpression:
Expression
Содержание | Предыдущий | Следующий | Индекс
Спецификация языка Java (HTML, сгенерированный Блинчиком "сюзет" Pelouch 24 февраля 1998)
Авторское право © Sun Microsystems, Inc 1996 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к doug.kramer@sun.com