<html>
<head>
<title>  Syntax</title>
</head>
<body BGCOLOR=#eeeeff text=#000000 LINK=#0000ff VLINK=#000077 ALINK=#ff0000>

<table border="0" width="100%">
<tr>
<td><a href="jTOC.doc.html">Contents</a> | <a href="memory.doc.html">Prev</a> | <a href="jIX.fm.html">Next</a> | <a href="jIX.fm.html">Index</a></td>
<td align=right><i>Java Language Specification</i><br>
<font size="-1">Second Edition</font></td></tr></table>
<hr><br>

<a name="52994"></a>
<p><strong>
CHAPTER
18 </strong></p>
<a name="52996"></a>
<h1> Syntax</h1>
<hr><p>
<a name="26238"></a>
This chapter presents a grammar for the Java programming language. <p>
<a name="26239"></a>
The grammar presented piecemeal in the preceding chapters is much better for exposition, but it is not ideally suited as a basis for a parser. The grammar presented in this chapter is the basis for the reference implementation. <p>
<a name="57494"></a>
The grammar below uses the following BNF-style conventions:<p>
<ul><a name="57488"></a>
<li><i>[x]</i> denotes zero or one occurrences of <i>x</i>.
<a name="57492"></a>
<li><i>{x}</i> denotes zero or more occurrences of <i>x</i>.
<a name="57493"></a>
<li><i>x </i>|<i> y</i> means one of either <i>x</i> or <i>y</i>.
</ul><a name="44467"></a>
<h2>18.1    The Grammar of the Java Programming Language</h2>
<ul><pre>
<i>Identifier:
       IDENTIFIER

QualifiedIdentifier:
       Identifier { </i>.<i> Identifier }

Literal:
       IntegerLiteral
       FloatingPointLiteral
       CharacterLiteral
       StringLiteral
       BooleanLiteral
       NullLiteral

Expression:
       Expression1 [AssignmentOperator Expression1]]

AssignmentOperator: </i>
       =
       +=
       -=
       *=
       /=
       &amp;=
       |=
       ^=
       %=
       &lt;&lt;=
       &gt;&gt;=
       &gt;&gt;&gt;=

<i>Type:
       Identifier {   </i>.<i>   Identifier } BracketsOpt
       BasicType

StatementExpression:
       Expression

ConstantExpression:
       Expression

Expression1:
       Expression2 [Expression1Rest]

Expression1Rest:
       [  </i>?<i>   Expression   </i>:<i>   Expression1]

Expression2 :
       Expression3 [Expression2Rest]

Expression2Rest:
       {Infixop Expression3}
       Expression3 </i>instanceof<i> Type

Infixop:<!-- </i> -->
</i>    ||<i>
</i>    &amp;&amp;<i>
</i>    |<i>
       ^
</i>    &amp;<i>
</i>    ==<i>
</i>    !=<i>
</i>    &lt;<i>
</i>    &gt;<i>
</i>    &lt;=<i>
</i>    &gt;=<i>
</i>    &lt;&lt;<i>
</i>    &gt;&gt;<i>
</i>    &gt;&gt;&gt;<i>
</i>    +<i>
</i>    -<i>
</i>    *<i>
</i>    /<i>
</i>    %<i>
</i>
<i>Expression3:
       PrefixOp Expression3
</i>    (<i>   Expr </i>|<i> Type   </i>)<i>   Expression3
       Primary {Selector} {PostfixOp}

Primary:
</i>    (<i> Expression </i>)
<i>     </i>this<i> [Arguments]
       </i>super<i> SuperSuffix
       Literal
       </i>new <i>Creator
       Identifier { </i>.<i> Identifier }[ IdentifierSuffix]
       BasicType BracketsOpt </i>.<i>class
</i>    void.class

<i>IdentifierSuffix:
</i>    [<i> ( </i>]<i> BracketsOpt   .   </i>class | <i>Expression</i> ]<i>)
       Arguments
       </i>.<i>   </i>(<i> class </i>|<i> this </i>|<i></i> super <i>Arguments </i>| new <i>InnerCreator )

PrefixOp:
</i>    ++<i>
</i>    --<i>
</i>    !<i>
</i>    ~<i>
</i>    +<i>
</i>    -<i>
</i>
<i>PostfixOp:
</i>    ++<i>
</i>    --<i>

Selector:
</i>    .<i> Identifier [Arguments]
</i>    . this
       . super <i>SuperSuffix
</i>    .<i> </i>new<i> InnerCreator
</i>    [<i> Expression </i>]<i>

SuperSuffix:
       Arguments
</i>    .<i> Identifier [Arguments]

BasicType:</i>
       byte
       short
       char
       int
       long
       float
       double
       boolean
<i>
ArgumentsOpt:
       [ Arguments ]

Arguments:
</i>    (<i> [Expression { </i>,<i> Expression }] </i>)<i>

BracketsOpt:
       {</i>[]<i>}

Creator:
       QualifiedIdentifier ( ArrayCreatorRest  </i>|<i> ClassCreatorRest )

InnerCreator:
       Identifier ClassCreatorRest

ArrayCreatorRest:
</i>    [<i> ( </i>]<i> BracketsOpt ArrayInitializer </i>|<i> Expression </i>]<i> {</i>[<i> Expression </i>]<i>}
BracketsOpt )

ClassCreatorRest:
       Arguments [ClassBody]

ArrayInitializer:
</i>    { <i>[VariableInitializer {</i>,<i> VariableInitializer} [</i>,<i>]] </i>}
<i>
VariableInitializer:
       ArrayInitializer
       Expression

ParExpression:
</i>    (<i> Expression </i>)
<i>
Block:
</i>    {<i> BlockStatements </i>}
<i>
BlockStatements:
       { BlockStatement }

BlockStatement :
       LocalVariableDeclarationStatement
       ClassOrInterfaceDeclaration
       [Identifier </i>:<i>] Statement

LocalVariableDeclarationStatement:
       [</i>final<i>] Type VariableDeclarators   </i>;<i>

Statement:
       Block
       </i>if<i> ParExpression Statement [</i>else<i> Statement]
       </i>for <i></i>(<i> ForInitOpt   </i>;<i>   [Expression]   </i>;<i>   ForUpdateOpt </i>)<i> Statement
       </i>while<i> ParExpression Statement
       </i>do<i> Statement </i>while<i> ParExpression   </i>;<i>
       </i>try<i> Block ( Catches </i>|<i> [Catches] </i>finally<i> Block )
</i>    switch<i> ParExpression </i>{<i> SwitchBlockStatementGroups </i>}
<i>     </i>synchronized<i> ParExpression Block
</i>    return<i> [Expression] </i>;<i>
       </i>throw<i> Expression   </i>;<i>
       </i>break<i> [Identifier]
       </i>continue<i> [Identifier]
</i>    ;<i>
       ExpressionStatement
       Identifier   </i>:<i>   Statement

Catches:
       CatchClause {CatchClause}

CatchClause:
</i>    catch<i> </i>(<i> FormalParameter </i>)<i> Block

SwitchBlockStatementGroups:
       { SwitchBlockStatementGroup }

SwitchBlockStatementGroup:
       SwitchLabel BlockStatements

SwitchLabel:
</i>    case<i> ConstantExpression   </i>:
<i>     default:

MoreStatementExpressions:
       { , StatementExpression }

ForInit:
       StatementExpression MoreStatementExpressions
       [</i>final<i>] Type VariableDeclarators

ForUpdate:
       StatementExpression MoreStatementExpressions

ModifiersOpt:
       { Modifier }

Modifier:</i>
       public
       protected
       private
       static
       abstract
       final
       native
       synchronized
       transient
       volatile
       strictfp
<i>
VariableDeclarators:
       VariableDeclarator { </i>,<i>   VariableDeclarator }

VariableDeclaratorsRest:
       VariableDeclaratorRest { </i>,<i>   VariableDeclarator }

ConstantDeclaratorsRest:
       ConstantDeclaratorRest { </i>,<i>   ConstantDeclarator }

VariableDeclarator:
       Identifier VariableDeclaratorRest

ConstantDeclarator:
       Identifier ConstantDeclaratorRest

VariableDeclaratorRest:
       BracketsOpt [  </i>=<i>   VariableInitializer]

ConstantDeclaratorRest:
       BracketsOpt   </i>=<i>   VariableInitializer

VariableDeclaratorId:
       Identifier BracketsOpt

CompilationUnit:
       [</i>package<i> QualifiedIdentifier   </i>;<i>  ] {ImportDeclaration}
{TypeDeclaration}

ImportDeclaration:
       </i>import<i> Identifier {   </i>.<i>   Identifier } [  </i> .<i>     </i>*<i>   ] </i>;<i>

TypeDeclaration:
       ClassOrInterfaceDeclaration
       ;

ClassOrInterfaceDeclaration:
       ModifiersOpt (ClassDeclaration </i>|<i> InterfaceDeclaration)

ClassDeclaration:
       </i>class<i> Identifier [extends Type] [implements TypeList] ClassBody

InterfaceDeclaration:
       </i>interface<i> Identifier [extends TypeList] InterfaceBody

TypeList:
       Type {  </i>,<i>   Type}

ClassBody:
</i>    {<i> {ClassBodyDeclaration} </i>}
<i>
InterfaceBody:
</i>    {<i> {InterfaceBodyDeclaration} </i>}
<i>
ClassBodyDeclaration:
</i>    ;
<i>     [</i>static<i>] Block
       ModifiersOpt MemberDecl

MemberDecl:
</i>    <i>MethodOrFieldDecl
       </i>void<i> Identifier MethodDeclaratorRest
       Identifier ConstructorDeclaratorRest
       ClassOrInterfaceDeclaration

MethodOrFieldDecl:
</i>    <i>Type Identifier MethodOrFieldRest

MethodOrFieldRest:
</i>    <i>VariableDeclaratorRest
       MethodDeclaratorRest

InterfaceBodyDeclaration:
</i>    ;<i>
       ModifiersOpt InterfaceMemberDecl

InterfaceMemberDecl:
</i>    <i>InterfaceMethodOrFieldDecl
       </i>void<i> Identifier VoidInterfaceMethodDeclaratorRest
       ClassOrInterfaceDeclaration

InterfaceMethodOrFieldDecl:
</i>    <i>Type Identifier InterfaceMethodOrFieldRest

InterfaceMethodOrFieldRest:
</i>    <i>ConstantDeclaratorsRest </i>;
<i>     InterfaceMethodDeclaratorRest

MethodDeclaratorRest:
               FormalParameters BracketsOpt [</i>throws<i> QualifiedIdentifierList] (
MethodBody </i>|<i>   </i>;<i>  )

VoidMethodDeclaratorRest:
               FormalParameters [</i>throws<i> QualifiedIdentifierList] ( MethodBody </i>|<i>   </i>;<i>  )

InterfaceMethodDeclaratorRest:
       FormalParameters BracketsOpt [</i>throws<i> QualifiedIdentifierList]   </i>;<i>

VoidInterfaceMethodDeclaratorRest:
       FormalParameters [</i>throws<i> QualifiedIdentifierList]   </i>;<i>

ConstructorDeclaratorRest:
       FormalParameters [</i>throws<i> QualifiedIdentifierList] MethodBody

QualifiedIdentifierList:
       QualifiedIdentifier {  </i>,<i>   QualifiedIdentifier}

FormalParameters:
</i>    (<i> [FormalParameter { </i>,<i> FormalParameter}] </i>)
<i>
FormalParameter:
       [</i>final<i>] Type VariableDeclaratorId

MethodBody:
       Block
</pre></ul>

<hr>
<table border="0" width="100%">
<tr>
<td><a href="jTOC.doc.html">Contents</a> | <a href="memory.doc.html">Prev</a> | <a href="jIX.fm.html">Next</a> | <a href="jIX.fm.html">Index</a></td>
<td align=right><i>Java Language Specification</i><br>
<font size="-1">Second Edition</font></td></tr></table>
<i><a href="jcopyright.doc.html">Copyright</a> &#169 2000 Sun Microsystems, Inc.
All rights reserved</i>
<br>
Please send any comments or corrections to <a href="mailto:[email protected]">[email protected]</a>
</font>
</body></html>