blob: 206b58a01f6f9e57c10ea7ef40e19f0bf3ed7294 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* Java Grammar */
%ab HexDigit : [0-9a-fA-F];
%ab Digit : [0-9];
%ab OctalDigit : [0-7];
%ab TetraDigit : [0-3];
%ab NonZeroDigit : [1-9];
%ab Letter : [a-zA-Z_];
%ab AnyButSlash : [^/];
%ab AnyButAstr : [^*];
%ab UniEsc : [\u0001];
%ab OctEscape1 : "\\" OctalDigit;
%ab OctEscape2 : "\\" OctalDigit OctalDigit;
%ab OctEscape3 : "\\" TetraDigit OctalDigit OctalDigit;
%ab OctEscape : OctEscape1 | OctEscape2 | OctEscape3;
%ab Escape : [\\] [rnbft\\'"];
%ab ULetter : Letter | UniEsc;
Identifier : ULetter ( ULetter Digit )*;
%ab IntSuffix : "l" | "L";
%ab DecimalNum : NonZeroDigit Digit* IntSuffix? ;
%ab OctalNum : "0" OctalDigit* IntSuffix? ;
%ab HexNum : "0" ("x"|"X") HexDigit HexDigit* IntSuffix? ;
%ab IntegerLiteral : DecimalNum | OctalNum | HexNum;
%ab Sign : "+" | "-";
%ab FlSuffix : "f" | "F" | "d" | "D";
%ab SignedInt : Sign? Digit+ ;
%ab Expo : "e" | "E" ;
%ab ExponentPart : Expo SignedInt? ;
%ab Float1 : Digit+ "." (Digit+)? ExponentPart? FlSuffix?;
%ab Float2 : "." Digit+ ExponentPart? FlSuffix? ;
%ab Float3 : Digit+ ExponentPart FlSuffix? ;
%ab Float4 : Digit+ FlSuffix ;
%ab FloatingPoint : Float1 | Float2 | Float3 | Float4 ;
%ab AnyChrChr : [^\\'] ;
%ab AnyStrChr : [^\\"] ;
%ab Character : "'" (Escape | OctEscape | AnyChrChr) "'" ;
%ab String : "\"" (Escape | OctEscape | AnyStrChr)* "\"";
%ab Numeric : IntegerLiteral | FloatingPoint ;
LITERAL : Numeric | Character | String ;
IDENTIFIER : ([a-zA-Z_] | [\u0001]) (([a-zA-Z_] | [\u0001]) | [0-9])*;
OP_DIM : "[" ([\r\n\t\ ] | ( "/" "\*" ([^\*] | "\*" [^/])* "\*" "/" |
"//" (.*)))* "]";
%ab SPACES : " "+;
%ab TAB : "\t";
%ab EOL : "\r" "\n"? | "\n" ;
// JAVADOC : "/**" ([^*] | [*] [^/])* "*/";
JAVADOC : "/**" Description Property+ "*/";
Description : ([\*\n\r\ \t]+ | DescriptionText)* ;
DescriptionText : [A-Za-z<>%]+ ([\ \t]+ [A-Za-z<>%]+)* ;
Property : "@" PropertyIdentifier [\ \t]+ Description ;
PropertyIdentifier : [A-Za-z]+ ;
%ab MULTILINECOMMENT : "/*" [^*] ([^*] | "*" [^/])* "*/";
%ab SINGLELINECOMMENT : "//" (.*);
WS : (SPACES|TAB|EOL|JAVADOC|MULTILINECOMMENT|SINGLELINECOMMENT)*
;
%start CompilationUnit;
TypeSpecifier
: TypeName Dims?
;
TypeName
: PrimitiveType
| QualifiedName
;
ClassNameList
: QualifiedName (WS "," WS QualifiedName)*
;
PrimitiveType
: "boolean"
| "char"
| "byte"
| "short"
| "int"
| "long"
| "float"
| "double"
| "void"
;
SemiColons
: ";"
| SemiColons ";"
;
CompilationUnit
: ProgramFile
;
ProgramFile
: WS PackageStatement (WS ImportStatements)? (WS TypeDeclarations)? WS
| (WS PackageStatement)? WS ImportStatements (WS TypeDeclarations)? WS
| (WS PackageStatement)? (WS ImportStatements)? WS TypeDeclarations WS
;
PackageStatement
: "package" WS QualifiedName WS SemiColons
;
TypeDeclarations
: TypeDeclarationOptSemi+
;
TypeDeclarationOptSemi
: TypeDeclaration SemiColons?
;
ImportStatements
: ImportStatement (WS ImportStatement)*
;
ImportStatement
: "import" WS QualifiedName ("." "*")? WS SemiColons
;
QualifiedName
: IDENTIFIER ("." IDENTIFIER)*
;
TypeDeclaration
: ClassHeader WS "{" (WS FieldDeclarations)? WS "}"
;
ClassHeader
: (Modifiers WS)? ClassWord WS IDENTIFIER (WS Extends)? (WS Interfaces)?
;
Modifiers
: Modifier ( WS Modifier )*
;
Modifier
: "abstract"
| "final"
| "public"
| "protected"
| "private"
| "static"
| "transient"
| "volatile"
| "native"
| "synchronized"
;
ClassWord
: "class"
| "interface"
;
Interfaces
: "implements" WS ClassNameList
;
FieldDeclarations
: FieldDeclaration ((WS SemiColons)? WS FieldDeclaration)*
;
FieldDeclaration
: FieldVariableDeclaration WS ";"
| MethodDeclaration
| ConstructorDeclaration
| StaticInitializer
| NonStaticInitializer
| TypeDeclaration
;
FieldVariableDeclaration
: (Modifiers WS)? TypeSpecifier WS VariableDeclarators
;
VariableDeclarators
: VariableDeclarator (WS "," WS VariableDeclarator)*
;
VariableDeclarator
: DeclaratorName (WS "=" WS VariableInitializer)?
;
VariableInitializer
: Expression
| "{" (WS ArrayInitializers)? WS "}"
;
ArrayInitializers
: VariableInitializer (WS "," WS VariableInitializer)*
;
MethodDeclaration
: (Modifiers WS)? TypeSpecifier WS MethodDeclarator (WS Throws)? WS MethodBody
;
MethodDeclarator
: DeclaratorName WS "(" (WS ParameterList)? WS ")"
| MethodDeclarator OP_DIM
;
ParameterList
: Parameter (WS "," WS Parameter)*
;
Parameter
: "final"? TypeSpecifier WS DeclaratorName
;
DeclaratorName
: IDENTIFIER
| DeclaratorName OP_DIM
;
Throws
: "throws" WS ClassNameList
;
MethodBody
: Block
| ";"
;
ConstructorDeclaration
: Modifiers? ConstructorDeclarator Throws? Block
;
ConstructorDeclarator
: IDENTIFIER "(" ParameterList? ")"
;
StaticInitializer
: "static" Block
;
NonStaticInitializer
: Block
;
Extends
: "extends" TypeName ("," TypeName)*
;
Block
: "{" (WS LocalVariableDeclarationsAndStatements)? WS "}"
;
LocalVariableDeclarationsAndStatements
: LocalVariableDeclarationOrStatement (WS LocalVariableDeclarationOrStatement)*
;
LocalVariableDeclarationOrStatement
: LocalVariableDeclarationStatement
| Statement
;
LocalVariableDeclarationStatement
: ("final" WS)? TypeSpecifier WS VariableDeclarators ";"
;
Statement
: EmptyStatement
| LabelStatement
| ExpressionStatement ";"
| SelectionStatement
| IterationStatement
| JumpStatement
| GuardingStatement
| Block
;
EmptyStatement
: ";"
;
LabelStatement
: IDENTIFIER ":"
| "case" ConstantExpression ":"
| "default" ":"
;
ExpressionStatement
: Expression
;
SelectionStatement
: "if" WS "(" WS Expression WS ")" WS Statement
| "if" WS "(" WS Expression WS ")" WS Statement WS "else" WS Statement
| "switch" WS "(" WS Expression WS ")" WS Block
;
IterationStatement
: "while" WS "(" WS Expression WS ")" WS Statement
| "do" WS Statement WS "while" WS "(" WS Expression WS ")" WS ";"
| "for" WS "(" WS ForInit WS ForExpr WS ForIncr WS ")" WS Statement
| "for" WS "(" WS ForInit WS ForExpr WS ")" WS Statement
;
ForInit
: ExpressionStatements WS ";"
| LocalVariableDeclarationStatement
| ";"
;
ForExpr
: Expression WS ";"
| ";"
;
ForIncr
: ExpressionStatements
;
ExpressionStatements
: ExpressionStatement (WS "," WS ExpressionStatement)*
;
JumpStatement
: "break" (WS IDENTIFIER)? WS ";"
| "continue" (WS IDENTIFIER)? WS ";"
| "return" (WS Expression)? WS ";"
| "throw" WS Expression WS ";"
;
GuardingStatement
: "synchronized" WS "(" WS Expression WS ")" WS Statement
| "try" WS Block WS Finally
| "try" WS Block WS Catches (WS Finally)?
;
Catches
: Catch (WS Catch)*
;
Catch
: CatchHeader WS Block
;
CatchHeader
: "catch" WS "(" WS TypeSpecifier (WS IDENTIFIER)? WS ")"
;
Finally
: "finally" WS Block
;
PrimaryExpression
: QualifiedName
| NotJustName
;
NotJustName
: SpecialName
| NewAllocationExpression
| ComplexPrimary
;
ComplexPrimary
: "(" WS Expression WS ")"
| ComplexPrimaryNoParenthesis
;
ComplexPrimaryNoParenthesis
: LITERAL
| "true" | "false"
| ArrayAccess
| FieldAccess
| MethodCall
;
ArrayAccess
: QualifiedName WS "[" WS Expression WS "]"
| ComplexPrimary WS "[" WS Expression WS "]"
;
FieldAccess
: NotJustName "." IDENTIFIER
| RealPostfixExpression "." IDENTIFIER
| QualifiedName "." "this"
| QualifiedName "." "class"
| PrimitiveType "." "class"
;
MethodCall
: MethodAccess WS "(" (WS ArgumentList)? WS ")"
;
MethodAccess
: ComplexPrimaryNoParenthesis
| SpecialName
| QualifiedName
;
SpecialName
: "this"
| "super"
| "null"
;
ArgumentList
: Expression (WS "," WS Expression)*
;
NewAllocationExpression
: (QualifiedName ".")? PlainNewAllocationExpression
;
PlainNewAllocationExpression
: ArrayAllocationExpression (WS "{" (WS ArrayInitializers)? WS "}")?
| ClassAllocationExpression (WS "{" (WS FieldDeclarations)? WS "}")?
;
ClassAllocationExpression
: "new" WS TypeName WS "(" (WS ArgumentList)? WS ")"
;
ArrayAllocationExpression
: "new" WS TypeName WS DimExprs (WS Dims)?
| "new" WS TypeName WS Dims
;
DimExprs
: DimExpr+
;
DimExpr
: "[" WS Expression WS "]"
;
Dims
: OP_DIM+
;
PostfixExpression
: PrimaryExpression
| RealPostfixExpression
;
RealPostfixExpression
: PostfixExpression WS ("++"|"--")
;
UnaryExpression
: ("++"|"--") UnaryExpression
| ("+"|"-") CastExpression
| LogicalUnaryExpression
;
LogicalUnaryExpression
: PostfixExpression
| ("~"|"!") UnaryExpression
;
CastExpression
: UnaryExpression
| "(" WS PrimitiveTypeExpression WS ")" WS CastExpression
| "(" WS ClassTypeExpression WS ")" WS CastExpression
| "(" WS Expression WS ")" WS LogicalUnaryExpression
;
PrimitiveTypeExpression
: PrimitiveType Dims?
;
ClassTypeExpression
: QualifiedName Dims
;
MultiplicativeExpression
: CastExpression (WS ("*"|"/"|"%") WS CastExpression)*
;
AdditiveExpression
: MultiplicativeExpression (WS ("+"|"-") WS MultiplicativeExpression)*
;
ShiftExpression
: AdditiveExpression (WS ("<<"|">>"|">>>") WS AdditiveExpression)*
;
RelationalExpression
: ShiftExpression (WS ("<"|">"|"<="|">=") WS ShiftExpression)*
| RelationalExpression WS "instanceof" WS TypeSpecifier
;
EqualityExpression
: RelationalExpression (WS ("==" | "!=") WS RelationalExpression)*
;
AndExpression
: EqualityExpression (WS "&" WS EqualityExpression)*
;
ExclusiveOrExpression
: AndExpression (WS "^" WS AndExpression)*
;
InclusiveOrExpression
: ExclusiveOrExpression (WS "|" WS ExclusiveOrExpression)*
;
ConditionalAndExpression
: InclusiveOrExpression (WS "&&" WS InclusiveOrExpression)*
;
ConditionalOrExpression
: ConditionalAndExpression (WS "||" WS ConditionalAndExpression)*
;
ConditionalExpression
: ConditionalOrExpression
| ConditionalOrExpression "?" Expression ":" ConditionalExpression
;
AssignmentExpression
: ConditionalExpression
| UnaryExpression WS AssignmentOperator WS AssignmentExpression
;
AssignmentOperator
: "="
| "+=" | "-=" | "*=" | "/=" | "&=" | "|=" | "^=" | "%=" | "<<=" | ">>=" | ">>>="
;
Expression
: AssignmentExpression
;
ConstantExpression
: ConditionalExpression
;