Java CC
Java CC
TOKENS
/**********************************************
* THE JAVACC TOKEN SPECIFICATION STARTS HERE *
**********************************************/
/* JAVACC RESERVED WORDS: These are the only tokens in JavaCC but not in Java */
<DEFAULT> TOKEN : {
<_LOOKAHEAD: "LOOKAHEAD">
| <_IGNORE_CASE: "IGNORE_CASE">
| <_PARSER_BEGIN: "PARSER_BEGIN">
| <_PARSER_END: "PARSER_END">
| <_JAVACODE: "JAVACODE">
| <_TOKEN: "TOKEN">
| <_SPECIAL_TOKEN: "SPECIAL_TOKEN">
| <_MORE: "MORE">
| <_SKIP: "SKIP">
| <_TOKEN_MGR_DECLS: "TOKEN_MGR_DECLS">
| <_EOF: "EOF">
}
/*
* The remainder of the tokens are exactly (except for the removal of tokens
* containing ">>" and "<<") as in the Java grammar and must be diff equivalent
* (again with the exceptions above) to it.
*/
/* WHITE SPACE */<DEFAULT> SKIP : {
" "
| "\t"
| "\n"
| "\r"
| "\f"
| "/*@egen*/" : AFTER_EGEN
}
<AFTER_EGEN> SKIP : {
<~[]> : DEFAULT
}
/* COMMENTS */<DEFAULT> MORE : {
"//" : IN_SINGLE_LINE_COMMENT
| <"/**" ~["/"]> : IN_FORMAL_COMMENT
| "/*" : IN_MULTI_LINE_COMMENT
| "/*@bgen(jjtree" : IN_MULTI_LINE_COMMENT
}
<IN_SINGLE_LINE_COMMENT> SPECIAL : {
<SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n"> : DEFAULT
}
<IN_FORMAL_COMMENT> SPECIAL : {
<FORMAL_COMMENT: "*/"> : DEFAULT
}
<IN_MULTI_LINE_COMMENT> SPECIAL : {
<MULTI_LINE_COMMENT: "*/"> : DEFAULT
}
<IN_SINGLE_LINE_COMMENT,IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT> MORE : {
<~[]>
}
/* JAVA RESERVED WORDS AND LITERALS */<DEFAULT> TOKEN : {
<ABSTRACT: "abstract">
| <ASSERT: "assert">
| <BOOLEAN: "boolean">
| <BREAK: "break">
| <BYTE: "byte">
| <CASE: "case">
| <CATCH: "catch">
| <CHAR: "char">
| <CLASS: "class">
| <CONST: "const">
| <CONTINUE: "continue">
| <_DEFAULT: "default">
| <DO: "do">
| <DOUBLE: "double">
| <ELSE: "else">
| <ENUM: "enum">
| <EXTENDS: "extends">
| <FALSE: "false">
| <FINAL: "final">
| <FINALLY: "finally">
| <FLOAT: "float">
| <FOR: "for">
| <GOTO: "goto">
| <IF: "if">
| <IMPLEMENTS: "implements">
| <IMPORT: "import">
| <INSTANCEOF: "instanceof">
| <INT: "int">
| <INTERFACE: "interface">
| <LONG: "long">
| <NATIVE: "native">
| <NEW: "new">
| <NULL: "null">
| <PACKAGE: "package">
| <PRIVATE: "private">
| <PROTECTED: "protected">
| <PUBLIC: "public">
| <RETURN: "return">
| <SHORT: "short">
| <STATIC: "static">
| <STRICTFP: "strictfp">
| <SUPER: "super">
| <SWITCH: "switch">
| <SYNCHRONIZED: "synchronized">
| <THIS: "this">
| <THROW: "throw">
| <THROWS: "throws">
| <TRANSIENT: "transient">
| <TRUE: "true">
| <TRY: "try">
| <VOID: "void">
| <VOLATILE: "volatile">
| <WHILE: "while">
}
|
|
|
|
|
|
|
}
<MINUSASSIGN: "-=">
<STARASSIGN: "*=">
<SLASHASSIGN: "/=">
<ANDASSIGN: "&=">
<ORASSIGN: "|=">
<XORASSIGN: "^=">
<REMASSIGN: "%=">
\u2115","\u2119"-"\u211d","\u2124","\u2126","\u2128","\u212a"-"\u212d","\u212f""\u2131","\u2133"-"\u2139","\u2160"-"\u2183","\u3005"-"\u3007","\u3021"-"\u3029"
,"\u3031"-"\u3035","\u3038"-"\u303a","\u3041"-"\u3094","\u309d"-"\u309e","\u30a1
"-"\u30fe","\u3105"-"\u312c","\u3131"-"\u318e","\u31a0"-"\u31b7","\u3400"-"\u4db
5","\u4e00"-"\u9fa5","\ua000"-"\ua48c","\uac00"-"\ud7a3","\uf900"-"\ufa2d","\ufb
00"-"\ufb06","\ufb13"-"\ufb17","\ufb1d","\ufb1f"-"\ufb28","\ufb2a"-"\ufb36","\uf
b38"-"\ufb3c","\ufb3e","\ufb40"-"\ufb41","\ufb43"-"\ufb44","\ufb46"-"\ufbb1","\u
fbd3"-"\ufd3d","\ufd50"-"\ufd8f","\ufd92"-"\ufdc7","\ufdf0"-"\ufdfb","\ufe33"-"\
ufe34","\ufe4d"-"\ufe4f","\ufe69","\ufe70"-"\ufe72","\ufe74","\ufe76"-"\ufefc","
\uff04","\uff21"-"\uff3a","\uff3f","\uff41"-"\uff5a","\uff65"-"\uffbe","\uffc2""\uffc7","\uffca"-"\uffcf","\uffd2"-"\uffd7","\uffda"-"\uffdc","\uffe0"-"\uffe1"
,"\uffe5"-"\uffe6"]>
| <#PART_LETTER: ["\u0000"-"\b","\u000e"-"\u001b","$","0"-"9","A"-"Z","_","a"-"z
","\u007f"-"\u009f","\u00a2"-"\u00a5","\u00aa","\u00b5","\u00ba","\u00c0"-"\u00d
6","\u00d8"-"\u00f6","\u00f8"-"\u021f","\u0222"-"\u0233","\u0250"-"\u02ad","\u02
b0"-"\u02b8","\u02bb"-"\u02c1","\u02d0"-"\u02d1","\u02e0"-"\u02e4","\u02ee","\u0
300"-"\u034e","\u0360"-"\u0362","\u037a","\u0386","\u0388"-"\u038a","\u038c","\u
038e"-"\u03a1","\u03a3"-"\u03ce","\u03d0"-"\u03d7","\u03da"-"\u03f3","\u0400"-"\
u0481","\u0483"-"\u0486","\u048c"-"\u04c4","\u04c7"-"\u04c8","\u04cb"-"\u04cc","
\u04d0"-"\u04f5","\u04f8"-"\u04f9","\u0531"-"\u0556","\u0559","\u0561"-"\u0587",
"\u0591"-"\u05a1","\u05a3"-"\u05b9","\u05bb"-"\u05bd","\u05bf","\u05c1"-"\u05c2"
,"\u05c4","\u05d0"-"\u05ea","\u05f0"-"\u05f2","\u0621"-"\u063a","\u0640"-"\u0655
","\u0660"-"\u0669","\u0670"-"\u06d3","\u06d5"-"\u06dc","\u06df"-"\u06e8","\u06e
a"-"\u06ed","\u06f0"-"\u06fc","\u070f"-"\u072c","\u0730"-"\u074a","\u0780"-"\u07
b0","\u0901"-"\u0903","\u0905"-"\u0939","\u093c"-"\u094d","\u0950"-"\u0954","\u0
958"-"\u0963","\u0966"-"\u096f","\u0981"-"\u0983","\u0985"-"\u098c","\u098f"-"\u
0990","\u0993"-"\u09a8","\u09aa"-"\u09b0","\u09b2","\u09b6"-"\u09b9","\u09bc","\
u09be"-"\u09c4","\u09c7"-"\u09c8","\u09cb"-"\u09cd","\u09d7","\u09dc"-"\u09dd","
\u09df"-"\u09e3","\u09e6"-"\u09f3","\u0a02","\u0a05"-"\u0a0a","\u0a0f"-"\u0a10",
"\u0a13"-"\u0a28","\u0a2a"-"\u0a30","\u0a32"-"\u0a33","\u0a35"-"\u0a36","\u0a38"
-"\u0a39","\u0a3c","\u0a3e"-"\u0a42","\u0a47"-"\u0a48","\u0a4b"-"\u0a4d","\u0a59
"-"\u0a5c","\u0a5e","\u0a66"-"\u0a74","\u0a81"-"\u0a83","\u0a85"-"\u0a8b","\u0a8
d","\u0a8f"-"\u0a91","\u0a93"-"\u0aa8","\u0aaa"-"\u0ab0","\u0ab2"-"\u0ab3","\u0a
b5"-"\u0ab9","\u0abc"-"\u0ac5","\u0ac7"-"\u0ac9","\u0acb"-"\u0acd","\u0ad0","\u0
ae0","\u0ae6"-"\u0aef","\u0b01"-"\u0b03","\u0b05"-"\u0b0c","\u0b0f"-"\u0b10","\u
0b13"-"\u0b28","\u0b2a"-"\u0b30","\u0b32"-"\u0b33","\u0b36"-"\u0b39","\u0b3c"-"\
u0b43","\u0b47"-"\u0b48","\u0b4b"-"\u0b4d","\u0b56"-"\u0b57","\u0b5c"-"\u0b5d","
\u0b5f"-"\u0b61","\u0b66"-"\u0b6f","\u0b82"-"\u0b83","\u0b85"-"\u0b8a","\u0b8e""\u0b90","\u0b92"-"\u0b95","\u0b99"-"\u0b9a","\u0b9c","\u0b9e"-"\u0b9f","\u0ba3"
-"\u0ba4","\u0ba8"-"\u0baa","\u0bae"-"\u0bb5","\u0bb7"-"\u0bb9","\u0bbe"-"\u0bc2
","\u0bc6"-"\u0bc8","\u0bca"-"\u0bcd","\u0bd7","\u0be7"-"\u0bef","\u0c01"-"\u0c0
3","\u0c05"-"\u0c0c","\u0c0e"-"\u0c10","\u0c12"-"\u0c28","\u0c2a"-"\u0c33","\u0c
35"-"\u0c39","\u0c3e"-"\u0c44","\u0c46"-"\u0c48","\u0c4a"-"\u0c4d","\u0c55"-"\u0
c56","\u0c60"-"\u0c61","\u0c66"-"\u0c6f","\u0c82"-"\u0c83","\u0c85"-"\u0c8c","\u
0c8e"-"\u0c90","\u0c92"-"\u0ca8","\u0caa"-"\u0cb3","\u0cb5"-"\u0cb9","\u0cbe"-"\
u0cc4","\u0cc6"-"\u0cc8","\u0cca"-"\u0ccd","\u0cd5"-"\u0cd6","\u0cde","\u0ce0"-"
\u0ce1","\u0ce6"-"\u0cef","\u0d02"-"\u0d03","\u0d05"-"\u0d0c","\u0d0e"-"\u0d10",
"\u0d12"-"\u0d28","\u0d2a"-"\u0d39","\u0d3e"-"\u0d43","\u0d46"-"\u0d48","\u0d4a"
-"\u0d4d","\u0d57","\u0d60"-"\u0d61","\u0d66"-"\u0d6f","\u0d82"-"\u0d83","\u0d85
"-"\u0d96","\u0d9a"-"\u0db1","\u0db3"-"\u0dbb","\u0dbd","\u0dc0"-"\u0dc6","\u0dc
a","\u0dcf"-"\u0dd4","\u0dd6","\u0dd8"-"\u0ddf","\u0df2"-"\u0df3","\u0e01"-"\u0e
3a","\u0e3f"-"\u0e4e","\u0e50"-"\u0e59","\u0e81"-"\u0e82","\u0e84","\u0e87"-"\u0
e88","\u0e8a","\u0e8d","\u0e94"-"\u0e97","\u0e99"-"\u0e9f","\u0ea1"-"\u0ea3","\u
0ea5","\u0ea7","\u0eaa"-"\u0eab","\u0ead"-"\u0eb9","\u0ebb"-"\u0ebd","\u0ec0"-"\
u0ec4","\u0ec6","\u0ec8"-"\u0ecd","\u0ed0"-"\u0ed9","\u0edc"-"\u0edd","\u0f00","
\u0f18"-"\u0f19","\u0f20"-"\u0f29","\u0f35","\u0f37","\u0f39","\u0f3e"-"\u0f47",
"\u0f49"-"\u0f6a","\u0f71"-"\u0f84","\u0f86"-"\u0f8b","\u0f90"-"\u0f97","\u0f99"
-"\u0fbc","\u0fc6","\u1000"-"\u1021","\u1023"-"\u1027","\u1029"-"\u102a","\u102c
"-"\u1032","\u1036"-"\u1039","\u1040"-"\u1049","\u1050"-"\u1059","\u10a0"-"\u10c
5","\u10d0"-"\u10f6","\u1100"-"\u1159","\u115f"-"\u11a2","\u11a8"-"\u11f9","\u12
00"-"\u1206","\u1208"-"\u1246","\u1248","\u124a"-"\u124d","\u1250"-"\u1256","\u1
258","\u125a"-"\u125d","\u1260"-"\u1286","\u1288","\u128a"-"\u128d","\u1290"-"\u
12ae","\u12b0","\u12b2"-"\u12b5","\u12b8"-"\u12be","\u12c0","\u12c2"-"\u12c5","\
u12c8"-"\u12ce","\u12d0"-"\u12d6","\u12d8"-"\u12ee","\u12f0"-"\u130e","\u1310","
\u1312"-"\u1315","\u1318"-"\u131e","\u1320"-"\u1346","\u1348"-"\u135a","\u1369""\u1371","\u13a0"-"\u13f4","\u1401"-"\u166c","\u166f"-"\u1676","\u1681"-"\u169a"
,"\u16a0"-"\u16ea","\u1780"-"\u17d3","\u17db","\u17e0"-"\u17e9","\u180b"-"\u180e
","\u1810"-"\u1819","\u1820"-"\u1877","\u1880"-"\u18a9","\u1e00"-"\u1e9b","\u1ea
0"-"\u1ef9","\u1f00"-"\u1f15","\u1f18"-"\u1f1d","\u1f20"-"\u1f45","\u1f48"-"\u1f
4d","\u1f50"-"\u1f57","\u1f59","\u1f5b","\u1f5d","\u1f5f"-"\u1f7d","\u1f80"-"\u1
fb4","\u1fb6"-"\u1fbc","\u1fbe","\u1fc2"-"\u1fc4","\u1fc6"-"\u1fcc","\u1fd0"-"\u
1fd3","\u1fd6"-"\u1fdb","\u1fe0"-"\u1fec","\u1ff2"-"\u1ff4","\u1ff6"-"\u1ffc","\
u200c"-"\u200f","\u202a"-"\u202e","\u203f"-"\u2040","\u206a"-"\u206f","\u207f","
\u20a0"-"\u20af","\u20d0"-"\u20dc","\u20e1","\u2102","\u2107","\u210a"-"\u2113",
"\u2115","\u2119"-"\u211d","\u2124","\u2126","\u2128","\u212a"-"\u212d","\u212f"
-"\u2131","\u2133"-"\u2139","\u2160"-"\u2183","\u3005"-"\u3007","\u3021"-"\u302f
","\u3031"-"\u3035","\u3038"-"\u303a","\u3041"-"\u3094","\u3099"-"\u309a","\u309
d"-"\u309e","\u30a1"-"\u30fe","\u3105"-"\u312c","\u3131"-"\u318e","\u31a0"-"\u31
b7","\u3400"-"\u4db5","\u4e00"-"\u9fa5","\ua000"-"\ua48c","\uac00"-"\ud7a3","\uf
900"-"\ufa2d","\ufb00"-"\ufb06","\ufb13"-"\ufb17","\ufb1d"-"\ufb28","\ufb2a"-"\u
fb36","\ufb38"-"\ufb3c","\ufb3e","\ufb40"-"\ufb41","\ufb43"-"\ufb44","\ufb46"-"\
ufbb1","\ufbd3"-"\ufd3d","\ufd50"-"\ufd8f","\ufd92"-"\ufdc7","\ufdf0"-"\ufdfb","
\ufe20"-"\ufe23","\ufe33"-"\ufe34","\ufe4d"-"\ufe4f","\ufe69","\ufe70"-"\ufe72",
"\ufe74","\ufe76"-"\ufefc","\ufeff","\uff04","\uff10"-"\uff19","\uff21"-"\uff3a"
,"\uff3f","\uff41"-"\uff5a","\uff65"-"\uffbe","\uffc2"-"\uffc7","\uffca"-"\uffcf
","\uffd2"-"\uffd7","\uffda"-"\uffdc","\uffe0"-"\uffe1","\uffe5"-"\uffe6","\ufff
9"-"\ufffb"]>
}
NON-TERMINALS
/************************************************
* THE JAVACC GRAMMAR SPECIFICATION STARTS HERE *
************************************************/
javacc_input
:=
javacc_options "PARSER_BEGIN" "(" identifier ")" CompilationUnit "PARSER_END" "(
" identifier ")" ( production )+ <EOF>
javacc_options :=
( <IDENTIFIER> "{" ( option_binding )* "}" )?
option_binding :=
( <IDENTIFIER> | "LOOKAHEAD" | "IGNORE_CASE" | "
static" ) "=" ( IntegerLiteral | BooleanLiteral | StringLiteral ) ";"
production
:=
javacode_production
|
regular_expr_production
|
token_manager_decls
|
bnf_production
javacode_production
:=
"JAVACODE" AccessModifier ResultType ide
ntifier FormalParameters ( "throws" Name ( "," Name )* )? Block
bnf_production :=
AccessModifier ResultType identifier FormalParam
eters ( "throws" Name ( "," Name )* )? ":" Block "{" expansion_choices "}"
AccessModifier :=
( "public" | "protected" | "private" )?
regular_expr_production :=
( "<" "*" ">" | "<" <IDENTIFIER> ( "," <
IDENTIFIER> )* ">" )? regexpr_kind ( "[" "IGNORE_CASE" "]" )? ":" "{" regexpr_sp
ec ( "|" regexpr_spec )* "}"
token_manager_decls
:=
"TOKEN_MGR_DECLS" ":" ClassOrInterfaceBo
dy
regexpr_kind
:=
"TOKEN"
|
"SPECIAL_TOKEN"
|
"SKIP"
|
"MORE"
regexpr_spec
:=
regular_expression ( Block )? ( ":" <IDENTIFIER>
)?
expansion_choices
:=
expansion ( "|" expansion )*
expansion
:=
( "LOOKAHEAD" "(" local_lookahead ")" )? ( expan
sion_unit )+
local_lookahead :=
( IntegerLiteral )? ( "," )? ( expansion_choices
)? ( "," )? ( "{" Expression "}" )?
expansion_unit :=
"LOOKAHEAD" "(" local_lookahead ")"
|
Block
|
"[" expansion_choices "]"
|
"try" "{" expansion_choices "}" ( "catch" "(" Name <IDEN
TIFIER> ")" Block )* ( "finally" Block )?
|
( PrimaryExpression "=" )? ( identifier Arguments | regu
lar_expression ( "." <IDENTIFIER> )? )
|
"(" expansion_choices ")" ( "+" | "*" | "?" )?
regular_expression
:=
StringLiteral
|
<LANGLE: "<"> ( ( "#" )? identifier ":" )? complex_regul
ar_expression_choices <RANGLE: ">">
|
"<" identifier ">"
|
"<" "EOF" ">"
complex_regular_expression_choices
:=
complex_regular_expressi
on ( "|" complex_regular_expression )*
complex_regular_expression
:=
( complex_regular_expression_uni
t )+
complex_regular_expression_unit :=
StringLiteral
|
"<" identifier ">"
|
character_list
|
"(" complex_regular_expression_choices ")" ( "+" | "*" |
"?" | "{" IntegerLiteral ( "," ( IntegerLiteral )? )? "}" )?
character_list :=
( "~" )? "[" ( character_descriptor ( "," charac
ter_descriptor )* )? "]"
character_descriptor
:=
StringLiteral ( "-" StringLiteral )?
identifier
:=
<IDENTIFIER>
/**********************************************
* THE JAVA GRAMMAR SPECIFICATION STARTS HERE *
**********************************************/
/*
* The Java grammar is modified to use sequences of tokens
* for the missing tokens - those that include "<<" and ">>".
*/
/*
* The following production defines Java identifiers - it
* includes the reserved words of JavaCC also.
*/
JavaIdentifier :=
( <IDENTIFIER> | "LOOKAHEAD" | "IGNORE_CASE" | "
PARSER_BEGIN" | "PARSER_END" | "JAVACODE" | "TOKEN" | "SPECIAL_TOKEN" | "MORE" |
"SKIP" | "TOKEN_MGR_DECLS" | "EOF" )
/*
* Program structuring syntax follows.
*/
CompilationUnit :=
( PackageDeclaration )? ( ImportDeclaration )* (
TypeDeclaration )*
PackageDeclaration
:=
Modifiers "package" Name ";"
ImportDeclaration
:=
"import" ( "static" )? Name ( "." "*" )?
";"
/*
* Modifiers. We match all modifiers in a single rule to reduce the chances of
* syntax errors for simple modifier mistakes. It will also enable us to give
* better error messages.
*/
Modifiers
:=
( ( "public" | "static" | "protected" | "private
" | "final" | "abstract" | "synchronized" | "native" | "transient" | "volatile"
| "strictfp" | Annotation ) )*
/*
* Declaration syntax follows.
*/
TypeDeclaration :=
";"
|
Modifiers ( ClassOrInterfaceDeclaration | EnumDeclaratio
n | AnnotationTypeDeclaration )
ClassOrInterfaceDeclaration
:=
( "class" | "interface" ) <IDENT
IFIER> ( TypeParameters )? ( ExtendsList )? ( ImplementsList )? ClassOrInterface
Body
ExtendsList
:=
"extends" ClassOrInterfaceType ( "," ClassOrInte
rfaceType )*
ImplementsList :=
"implements" ClassOrInterfaceType ( "," ClassOrI
nterfaceType )*
EnumDeclaration :=
"enum" <IDENTIFIER> ( ImplementsList )? EnumBody
EnumBody
:=
"{" ( EnumConstant ( "," EnumConstant )* )? ( ",
" )? ( ";" ( ClassOrInterfaceBodyDeclaration )* )? "}"
EnumConstant
:=
Modifiers <IDENTIFIER> ( Arguments )? ( ClassOrI
nterfaceBody )?
TypeParameters :=
"<" TypeParameter ( "," TypeParameter )* ">"
TypeParameter :=
<IDENTIFIER> ( TypeBound )?
TypeBound
:=
"extends" ClassOrInterfaceType ( "&" ClassOrInte
rfaceType )*
ClassOrInterfaceBody
:=
"{" ( ClassOrInterfaceBodyDeclaration )*
"}"
ClassOrInterfaceBodyDeclaration :=
Initializer
|
Modifiers ( ClassOrInterfaceDeclaration | EnumDeclaratio
n | ConstructorDeclaration | FieldDeclaration | MethodDeclaration )
|
";"
FieldDeclaration
:=
Type VariableDeclarator ( "," VariableDe
clarator )* ";"
VariableDeclarator
:=
VariableDeclaratorId ( "=" VariableIniti
alizer )?
VariableDeclaratorId
:=
<IDENTIFIER> ( "[" "]" )*
VariableInitializer
:=
ArrayInitializer
|
Expression
ArrayInitializer
:=
"{" ( VariableInitializer ( "," Variable
Initializer )* )? ( "," )? "}"
MethodDeclaration
:=
( TypeParameters )? ResultType MethodDec
larator ( "throws" NameList )? ( Block | ";" )
MethodDeclarator
:=
<IDENTIFIER> FormalParameters ( "[" "]"
)*
FormalParameters
:=
"(" ( FormalParameter ( "," FormalParame
ter )* )? ")"
FormalParameter :=
Modifiers Type ( "..." )? VariableDeclaratorId
ConstructorDeclaration :=
( TypeParameters )? <IDENTIFIER> FormalP
arameters ( "throws" NameList )? "{" ( ExplicitConstructorInvocation )? ( BlockS
tatement )* "}"
ExplicitConstructorInvocation :=
"this" Arguments ";"
|
( PrimaryExpression "." )? "super" Arguments ";"
Initializer
:=
( "static" )? Block
/*
* Type, name and expression syntax follows.
*/
Type
:=
ReferenceType
|
PrimitiveType
ReferenceType :=
PrimitiveType ( "[" "]" )+
|
( ClassOrInterfaceType ) ( "[" "]" )*
ClassOrInterfaceType
:=
<IDENTIFIER> ( TypeArguments )? ( "." <I
DENTIFIER> ( TypeArguments )? )*
TypeArguments :=
"<" TypeArgument ( "," TypeArgument )* ">"
TypeArgument
:=
ReferenceType
|
"?" ( WildcardBounds )?
WildcardBounds :=
"extends" ReferenceType
|
"super" ReferenceType
PrimitiveType
|
|
|
|
|
|
|
ResultType
Name
:=
NameList
:=
"boolean"
"char"
"byte"
"short"
"int"
"long"
"float"
"double"
:=
( "void" | Type )
JavaIdentifier ( "." JavaIdentifier )*
:=
Name ( "," Name )*
/*
* Expression syntax follows.
*/
Expression
:=
ConditionalExpression ( AssignmentOperator Expre
ssion )?
AssignmentOperator
:=
"="
|
"*="
|
"/="
|
"%="
|
"+="
|
"-="
|
"<<="
|
">>="
|
">>>="
|
"&="
|
"^="
|
"|="
ConditionalExpression :=
ConditionalOrExpression ( "?" Expression
":" Expression )?
ConditionalOrExpression :=
ConditionalAndExpression ( "||" Conditio
nalAndExpression )*
ConditionalAndExpression
:=
InclusiveOrExpression ( "&&" Inc
lusiveOrExpression )*
InclusiveOrExpression :=
ExclusiveOrExpression ( "|" ExclusiveOrE
xpression )*
ExclusiveOrExpression :=
AndExpression ( "^" AndExpression )*
AndExpression :=
EqualityExpression ( "&" EqualityExpression )*
EqualityExpression
:=
InstanceOfExpression ( ( "==" | "!=" ) I
nstanceOfExpression )*
InstanceOfExpression
:=
RelationalExpression ( "instanceof" Type
)?
RelationalExpression
:=
ShiftExpression ( ( "<" | ">" | "<=" | "
>=" ) ShiftExpression )*
ShiftExpression :=
AdditiveExpression ( ( "<<" | RSIGNEDSHIFT | RUN
SIGNEDSHIFT ) AdditiveExpression )*
AdditiveExpression
:=
MultiplicativeExpression ( ( "+" | "-" )
MultiplicativeExpression )*
MultiplicativeExpression
:=
UnaryExpression ( ( "*" | "/" |
"%" ) UnaryExpression )*
UnaryExpression :=
( "+" | "-" ) UnaryExpression
|
PreIncrementExpression
|
PreDecrementExpression
|
UnaryExpressionNotPlusMinus
PreIncrementExpression :=
"++" PrimaryExpression
PreDecrementExpression :=
"--" PrimaryExpression
UnaryExpressionNotPlusMinus
:=
( "~" | "!" ) UnaryExpression
|
CastExpression
|
PostfixExpression
// This production is to determine lookahead only. The LOOKAHEAD specifications
// below are not used, but they are there just to indicate that we know about
// this.
CastLookahead :=
"(" PrimitiveType
|
"(" Type "[" "]"
|
"(" Type ")" ( "~" | "!" | "(" | <IDENTIFIER> | "this" |
"super" | "new" | Literal )
PostfixExpression
:=
PrimaryExpression ( "++" | "--" )?
CastExpression :=
"(" Type ")" UnaryExpression
|
"(" Type ")" UnaryExpressionNotPlusMinus
PrimaryExpression
:=
PrimaryPrefix ( PrimarySuffix )*
MemberSelector :=
"." TypeArguments <IDENTIFIER>
PrimaryPrefix :=
Literal
|
"this"
|
"super" "." <IDENTIFIER>
|
"(" Expression ")"
|
AllocationExpression
|
ResultType "." "class"
|
Name
PrimarySuffix :=
"." "this"
|
"." AllocationExpression
|
MemberSelector
|
"[" Expression "]"
|
"." <IDENTIFIER>
|
Arguments
Literal :=
<INTEGER_LITERAL>
|
<FLOATING_POINT_LITERAL>
|
<CHARACTER_LITERAL>
|
<STRING_LITERAL>
|
BooleanLiteral
|
NullLiteral
IntegerLiteral :=
<INTEGER_LITERAL>
BooleanLiteral :=
"true"
|
"false"
StringLiteral :=
<STRING_LITERAL>
NullLiteral
:=
"null"
Arguments
:=
"(" ( ArgumentList )? ")"
ArgumentList
:=
Expression ( "," Expression )*
AllocationExpression
:=
"new" PrimitiveType ArrayDimsAndInits
|
"new" ClassOrInterfaceType ( TypeArguments )? ( ArrayDim
sAndInits | Arguments ( ClassOrInterfaceBody )? )
/*
* The third LOOKAHEAD specification below is to parse to PrimarySuffix
* if there is an expression between the "[...]".
*/
ArrayDimsAndInits
:=
( "[" Expression "]" )+ ( "[" "]" )*
|
( "[" "]" )+ ArrayInitializer
/*
* Statement syntax follows.
*/
Statement
:=
LabeledStatement
|
AssertStatement
|
Block
|
EmptyStatement
|
StatementExpression ";"
|
SwitchStatement
|
IfStatement
|
WhileStatement
|
DoStatement
|
ForStatement
|
BreakStatement
|
ContinueStatement
|
ReturnStatement
|
ThrowStatement
|
SynchronizedStatement
|
TryStatement
AssertStatement :=
"assert" Expression ( ":" Expression )? ";"
LabeledStatement
:=
<IDENTIFIER> ":" Statement
Block :=
"{" ( BlockStatement )* "}"
BlockStatement :=
LocalVariableDeclaration ";"
|
Statement
|
ClassOrInterfaceDeclaration
LocalVariableDeclaration
:=
Modifiers Type VariableDeclarato
r ( "," VariableDeclarator )*
EmptyStatement :=
";"
StatementExpression
:=
PreIncrementExpression
|
PreDecrementExpression
|
PrimaryExpression ( "++" | "--" | AssignmentOperator Exp
ression )?
SwitchStatement :=
"switch" "(" Expression ")" "{" ( SwitchLabel (
BlockStatement )* )* "}"
SwitchLabel
:=
"case" Expression ":"
|
"default" ":"
IfStatement
:=
"if" "(" Expression ")" Statement ( "else" State
ment )?
WhileStatement :=
"while" "(" Expression ")" Statement
DoStatement
:=
"do" Statement "while" "(" Expression ")" ";"
ForStatement
:=
"for" "(" ( Modifiers Type <IDENTIFIER> ":" Expr
ession | ( ForInit )? ";" ( Expression )? ";" ( ForUpdate )? ) ")" Statement
ForInit :=
LocalVariableDeclaration
|
StatementExpressionList
StatementExpressionList :=
StatementExpression ( "," StatementExpre
ssion )*
ForUpdate
:=
StatementExpressionList
BreakStatement :=
"break" ( <IDENTIFIER> )? ";"
ContinueStatement
:=
"continue" ( <IDENTIFIER> )? ";"
ReturnStatement :=
"return" ( Expression )? ";"
ThrowStatement :=
"throw" Expression ";"
SynchronizedStatement :=
"synchronized" "(" Expression ")" Block
TryStatement
:=
"try" Block ( "catch" "(" FormalParameter ")" Bl
ock )* ( "finally" Block )?
/* We use productions to match >>>, >> and > so that we can keep the
* type declaration syntax with generics clean
*/
RUNSIGNEDSHIFT :=
( ">" ">" ">" )
RSIGNEDSHIFT
:=
( ">" ">" )
/* Annotation syntax follows. */
Annotation
:=
NormalAnnotation
|
SingleMemberAnnotation
|
MarkerAnnotation
NormalAnnotation
:=
"@" Name "(" ( MemberValuePairs )? ")"
MarkerAnnotation
:=
"@" Name
SingleMemberAnnotation :=
"@" Name "(" MemberValue ")"
MemberValuePairs
:=
MemberValuePair ( "," MemberValuePair )*
MemberValuePair :=
<IDENTIFIER> "=" MemberValue
MemberValue
:=
Annotation
|
MemberValueArrayInitializer
|
ConditionalExpression
MemberValueArrayInitializer
:=
"{" MemberValue ( "," MemberValu
e )* ( "," )? "}"
/* Annotation Types. */ AnnotationTypeDeclaration
:=
"@" "interface"
<IDENTIFIER> AnnotationTypeBody
AnnotationTypeBody
:=
"{" ( AnnotationTypeMemberDeclaration )*
"}"
AnnotationTypeMemberDeclaration :=
Modifiers ( Type <IDENTIFIER> "(
" ")" ( DefaultValue )? ";" | ClassOrInterfaceDeclaration | EnumDeclaration | An
notationTypeDeclaration | FieldDeclaration )
|
( ";" )
DefaultValue
:=
"default" MemberValue
DOCUMENT END