org.codehaus.janino
public class Parser extends Object
| Nested Class Summary | |
|---|---|
| static class | Parser.ClassDeclarationContext |
| static class | Parser.InterfaceDeclarationContext |
| static class | Parser.ParseException
An exception that reflects an error during parsing.
|
| Constructor Summary | |
|---|---|
| Parser(Scanner scanner) | |
| Method Summary | |
|---|---|
| void | eatToken() |
| Scanner | getScanner() |
| Location | location() |
| Java.Atom | parseAdditiveExpression()
AdditiveExpression :=
MultiplicativeExpression { ( '+' | '-' ) MultiplicativeExpression }
|
| Java.Atom | parseAndExpression()
AndExpression :=
EqualityExpression { '&' EqualityExpression }
|
| Java.Rvalue[] | parseArgumentList()
ArgumentList := Expression { ',' Expression }
|
| Java.Rvalue[] | parseArguments()
Arguments := '(' [ ArgumentList ] ')'
|
| Java.ArrayInitializer | parseArrayInitializer()
ArrayInitializer :=
'{' [ VariableInitializer { ',' VariableInitializer } [ ',' ] '}'
|
| Java.Atom | parseAssignmentExpression()
AssignmentExpression :=
ConditionalExpression [ AssignmentOperator AssignmentExpression ]
AssignmentOperator :=
'=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' |
'>>=' | '>>>=' | '&=' | '^=' | '|='
|
| Java.Block | parseBlock()
'{' BlockStatements '}'
|
| Java.BlockStatement | parseBlockStatement()
BlockStatement := { Identifier ':' } (
( Modifiers Type | ModifiersOpt BasicType ) LocalVariableDeclarators ';' |
'class' ... |
| List | parseBlockStatements()
BlockStatements := { BlockStatement }
|
| Java.Statement | parseBreakStatement()BreakStatement := 'break' [ Identifier ] ';' |
| void | parseClassBody(Java.ClassDeclaration classDeclaration)
ClassBody := '{' { ClassBodyDeclaration } '}'
|
| void | parseClassBodyDeclaration(Java.ClassDeclaration classDeclaration)
ClassBodyDeclaration :=
';' |
ModifiersOpt (
Block | // Instance (JLS2 8.6) or static initializer (JLS2 8.7)
'void' Identifier MethodDeclarationRest |
'class' ClassDeclarationRest |
'interface' InterfaceDeclarationRest |
ConstructorDeclarator |
Type Identifier (
MethodDeclarationRest |
FieldDeclarationRest ';'
)
)
|
| Java.NamedClassDeclaration | parseClassDeclarationRest(String optionalDocComment, short modifiers, Parser.ClassDeclarationContext context)
ClassDeclarationRest :=
Identifier
[ 'extends' ReferenceType ]
[ 'implements' ReferenceTypeList ]
ClassBody
|
| Java.CompilationUnit | parseCompilationUnit()
CompilationUnit := [ PackageDeclaration ]
{ ImportDeclaration }
{ TypeDeclaration }
|
| Java.Atom | parseConditionalAndExpression()
ConditionalAndExpression :=
InclusiveOrExpression { '&&' InclusiveOrExpression }
|
| Java.Atom | parseConditionalExpression()
ConditionalExpression :=
ConditionalOrExpression [ '? |
| Java.Atom | parseConditionalOrExpression()
ConditionalOrExpression :=
ConditionalAndExpression { '||' ConditionalAndExpression ]
|
| Java.ConstructorDeclarator | parseConstructorDeclarator(String optionalDocComment, short modifiers)
ConstructorDeclarator :=
Identifier
FormalParameters
[ 'throws' ReferenceTypeList ]
'{'
[ 'this' Arguments ';' | 'super' Arguments ';' | Primary '.' 'super' Arguments ';' ]
BlockStatements
'}'
|
| Java.Statement | parseContinueStatement()ContinueStatement := 'continue' [ Identifier ] ';' |
| Java.Rvalue | parseDimExpr()DimExpr := '[' Expression ']' |
| Java.Rvalue[] | parseDimExprs()
DimExprs := DimExpr { DimExpr }
|
| Java.Statement | parseDoStatement()
DoStatement := 'do' Statement 'while' '(' Expression ')' ';'
|
| Java.Statement | parseEmptyStatement()EmptyStatement := ';' |
| Java.Atom | parseEqualityExpression()
EqualityExpression :=
RelationalExpression { ( '==' | '! |
| Java.Atom | parseExclusiveOrExpression()
ExclusiveOrExpression :=
AndExpression { '^' AndExpression }
|
| Java.Atom | parseExpression()Expression := AssignmentExpression |
| Java.Rvalue[] | parseExpressionList()
ExpressionList := Expression { ',' Expression }
|
| Java.Statement | parseExpressionStatement()ExpressionStatement := Expression ';' |
| Java.VariableDeclarator[] | parseFieldDeclarationRest(String name)
FieldDeclarationRest :=
VariableDeclaratorRest
{ ',' VariableDeclarator }
|
| Java.FunctionDeclarator.FormalParameter | parseFormalParameter()FormalParameter := [ 'final' ] Type Identifier BracketsOpt |
| Java.FunctionDeclarator.FormalParameter[] | parseFormalParameters()
FormalParameters := '(' [ FormalParameter { ',' FormalParameter } ] ')'
|
| Java.Statement | parseForStatement()
ForStatement :=
'for' '('
[ ForInit ] ';'
[ Expression ] ';'
[ ExpressionList ]
')' Statement
|
| Java.Statement | parseIfStatement()
IfStatement := 'if' '(' Expression ')' Statement [ 'else' Statement ]
|
| Java.CompilationUnit.ImportDeclaration | parseImportDeclaration()ImportDeclaration := 'import' ImportDeclarationBody ';' |
| Java.CompilationUnit.ImportDeclaration | parseImportDeclarationBody()
ImportDeclarationBody := [ 'static' ] Identifier { '.' Identifier } [ '.' '*' ]
|
| Java.Atom | parseInclusiveOrExpression()
InclusiveOrExpression :=
ExclusiveOrExpression { '|' ExclusiveOrExpression }
|
| void | parseInterfaceBody(Java.InterfaceDeclaration interfaceDeclaration)
InterfaceBody := '{' {
';' |
ModifiersOpt (
'void' Identifier MethodDeclarationRest |
'class' ClassDeclarationRest |
'interface' InterfaceDeclarationRest |
Type Identifier (
MethodDeclarationRest |
FieldDeclarationRest
)
)
} '}'
|
| Java.InterfaceDeclaration | parseInterfaceDeclarationRest(String optionalDocComment, short modifiers, Parser.InterfaceDeclarationContext context)
InterfaceDeclarationRest :=
Identifier
[ 'extends' ReferenceTypeList ]
InterfaceBody
|
| Java.Statement | parseLabeledStatement()LabeledStatement := Identifier ':' Statement |
| Java.Atom | parseLiteral() |
| Java.VariableDeclarator[] | parseLocalVariableDeclarators()
LocalVariableDeclarators := VariableDeclarator { ',' VariableDeclarator }
|
| Java.Block | parseMethodBody()MethodBody := Block |
| Java.MethodDeclarator | parseMethodDeclarationRest(String optionalDocComment, short modifiers, Java.Type type, String name)
MethodDeclarationRest :=
FormalParameters
{ '[' ']' }
[ 'throws' ReferenceTypeList ]
( ';' | MethodBody )
|
| short | parseModifiersOpt()
ModifiersOpt := { 'public' | 'protected' | 'private' | 'static' |
'abstract' | 'final' | 'native' | 'synchronized' |
'transient' | 'volatile' | 'strictfp'
|
| Java.Atom | parseMultiplicativeExpression()
MultiplicativeExpression :=
UnaryExpression { ( '*' | '/' | '%' ) UnaryExpression }
|
| Java.PackageDeclaration | parsePackageDeclaration()PackageDeclaration := 'package' QualifiedIdentifier ';' |
| Java.PackageMemberTypeDeclaration | parsePackageMemberTypeDeclaration()
PackageMemberTypeDeclaration :=
ModifiersOpt 'class' ClassDeclarationRest |
ModifiersOpt 'interface' InterfaceDeclarationRest
|
| Java.Atom | parsePrimary()
Primary :=
CastExpression | // CastExpression 15.16
'(' Expression ')' | // ParenthesizedExpression 15.8.5
Literal | // Literal 15.8.1
Name | // AmbiguousName
Name Arguments | // MethodInvocation
Name '[]' { '[]' } | // ArrayType 10.1
Name '[]' { '[]' } '.' 'class' | // ClassLiteral 15.8.2
'this' | // This 15.8.3
'this' Arguments | // Alternate constructor invocation 8.8.5.1
'super' Arguments | // Unqualified superclass constructor invocation 8.8.5.1
'super' '.' Identifier | // SuperclassFieldAccess 15.11.2
'super' '.' Identifier Arguments | // SuperclassMethodInvocation 15.12.4.9
NewClassInstance |
NewAnonymousClassInstance | // ClassInstanceCreationExpression 15.9
NewArray | // ArrayCreationExpression 15.10
NewInitializedArray | // ArrayInitializer 10.6
BasicType { '[]' } | // Type
BasicType { '[]' } '.' 'class' | // ClassLiteral 15.8.2
'void' '.' 'class' // ClassLiteral 15.8.2
CastExpression :=
'(' PrimitiveType { '[]' } ')' UnaryExpression |
'(' Expression ')' UnaryExpression
NewClassInstance := 'new' ReferenceType Arguments
NewAnonymousClassInstance := 'new' ReferenceType Arguments [ ClassBody ]
NewArray := 'new' Type DimExprs { '[]' }
NewInitializedArray := 'new' ArrayType ArrayInitializer
|
| String[] | parseQualifiedIdentifier()
QualifiedIdentifier := Identifier { '.' Identifier } |
| Java.ReferenceType | parseReferenceType()ReferenceType := QualifiedIdentifier |
| Java.ReferenceType[] | parseReferenceTypeList()
ReferenceTypeList := ReferenceType { ',' ReferenceType }
|
| Java.Atom | parseRelationalExpression()
RelationalExpression :=
ShiftExpression {
( ( '<' | '>' | '<=' | '>=' ) ShiftExpression ) |
( 'instanceof' ReferenceType )
}
|
| Java.Statement | parseReturnStatement()ReturnStatement := 'return' [ Expression ] ';' |
| Java.Atom | parseSelector(Java.Atom atom)
Selector :=
'.' Identifier | // FieldAccess 15.11.1
'.' Identifier Arguments | // MethodInvocation
'.' 'this' // QualifiedThis 15.8.4
'.' 'super' Arguments // Qualified superclass constructor invocation (JLS 8.8.5.1)
'.' 'super' '.' Identifier | // SuperclassFieldReference (JLS 15.11.2)
'.' 'super' '.' Identifier Arguments | // SuperclassMethodInvocation (JLS 15.12.4.9)
'.' 'new' Identifier Arguments [ ClassBody ] | // QualifiedClassInstanceCreationExpression 15.9
'.' 'class'
'[' Expression ']' // ArrayAccessExpression 15.13
|
| Java.Atom | parseShiftExpression()
ShiftExpression :=
AdditiveExpression { ( '<<' | '>>' | '>>>' ) AdditiveExpression }
|
| Java.Statement | parseStatement()
Statement :=
LabeledStatement |
Block |
IfStatement |
ForStatement |
WhileStatement |
DoStatement |
TryStatement |
'switch' ... |
| Java.Statement | parseSwitchStatement()
SwitchStatement :=
'switch' '(' Expression ')' '{' { SwitchLabels BlockStatements } '}'
SwitchLabels := SwitchLabels { SwitchLabels }
SwitchLabel := 'case' Expression ':' | 'default' ':'
|
| Java.Statement | parseSynchronizedStatement()
SynchronizedStatement :=
'synchronized' '(' expression ')' Block
|
| Java.Statement | parseThrowStatement()ThrowStatement := 'throw' Expression ';' |
| Java.Statement | parseTryStatement()
TryStatement :=
'try' Block Catches [ Finally ] |
'try' Block Finally
Catches := CatchClause { CatchClause }
CatchClause := 'catch' '(' FormalParameter ')' Block
Finally := 'finally' Block
|
| Java.Type | parseType()
Type := (
'byte' | 'short' | 'char' | 'int' | 'long' |
'float' | 'double' | 'boolean' |
ReferenceType
) { '[' ']' }
|
| Java.Atom | parseUnaryExpression()
UnaryExpression :=
{ PrefixOperator } Primary { Selector } { PostfixOperator }
PrefixOperator := '++' | '--' | '+' | '-' | '~' | '! |
| Java.VariableDeclarator | parseVariableDeclarator()VariableDeclarator := Identifier VariableDeclaratorRest |
| Java.VariableDeclarator | parseVariableDeclaratorRest(String name)
VariableDeclaratorRest := { '[' ']' } [ '=' VariableInitializer ]
Used by field declarations and local variable declarations. |
| Java.ArrayInitializerOrRvalue | parseVariableInitializer()
VariableInitializer :=
ArrayInitializer |
Expression
|
| Java.Statement | parseWhileStatement()
WhileStatement := 'while' '(' Expression ')' Statement
|
| boolean | peekIdentifier() |
| boolean | peekKeyword() |
| boolean | peekKeyword(String keyword) |
| boolean | peekKeyword(String[] keywords) |
| boolean | peekOperator(String operator) |
| boolean | peekOperator(String[] operators) |
| String | readIdentifier() |
| void | readKeyword(String keyword) |
| String | readOperator() |
| void | readOperator(String operator) |
| void | setWarningHandler(WarningHandler optionalWarningHandler)
By default, warnings are discarded, but an application my install a
WarningHandler.
|
| protected void | throwParseException(String message)
Convenience method for throwing a ParseException. |
AdditiveExpression :=
MultiplicativeExpression { ( '+' | '-' ) MultiplicativeExpression }
AndExpression :=
EqualityExpression { '&' EqualityExpression }
ArgumentList := Expression { ',' Expression }
Arguments := '(' [ ArgumentList ] ')'
ArrayInitializer :=
'{' [ VariableInitializer { ',' VariableInitializer } [ ',' ] '}'
AssignmentExpression :=
ConditionalExpression [ AssignmentOperator AssignmentExpression ]
AssignmentOperator :=
'=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' |
'>>=' | '>>>=' | '&=' | '^=' | '|='
'{' BlockStatements '}'
BlockStatement := { Identifier ':' } (
( Modifiers Type | ModifiersOpt BasicType ) LocalVariableDeclarators ';' |
'class' ... |
Statement |
'final' Type LocalVariableDeclarators ';' |
Expression ';' |
Expression LocalVariableDeclarators ';' (1)
)
(1) "Expression" must pose a type, and has optional trailing brackets.
BlockStatements := { BlockStatement }
BreakStatement := 'break' [ Identifier ] ';'
ClassBody := '{' { ClassBodyDeclaration } '}'
ClassBodyDeclaration :=
';' |
ModifiersOpt (
Block | // Instance (JLS2 8.6) or static initializer (JLS2 8.7)
'void' Identifier MethodDeclarationRest |
'class' ClassDeclarationRest |
'interface' InterfaceDeclarationRest |
ConstructorDeclarator |
Type Identifier (
MethodDeclarationRest |
FieldDeclarationRest ';'
)
)
ClassDeclarationRest :=
Identifier
[ 'extends' ReferenceType ]
[ 'implements' ReferenceTypeList ]
ClassBody
CompilationUnit := [ PackageDeclaration ]
{ ImportDeclaration }
{ TypeDeclaration }
ConditionalAndExpression :=
InclusiveOrExpression { '&&' InclusiveOrExpression }
ConditionalExpression :=
ConditionalOrExpression [ '?' Expression ':' ConditionalExpression ]
ConditionalOrExpression :=
ConditionalAndExpression { '||' ConditionalAndExpression ]
ConstructorDeclarator :=
Identifier
FormalParameters
[ 'throws' ReferenceTypeList ]
'{'
[ 'this' Arguments ';' | 'super' Arguments ';' | Primary '.' 'super' Arguments ';' ]
BlockStatements
'}'
ContinueStatement := 'continue' [ Identifier ] ';'
DimExpr := '[' Expression ']'
DimExprs := DimExpr { DimExpr }
DoStatement := 'do' Statement 'while' '(' Expression ')' ';'
EmptyStatement := ';'
EqualityExpression :=
RelationalExpression { ( '==' | '!=' ) RelationalExpression }
ExclusiveOrExpression :=
AndExpression { '^' AndExpression }
Expression := AssignmentExpression
ExpressionList := Expression { ',' Expression }
ExpressionStatement := Expression ';'
FieldDeclarationRest :=
VariableDeclaratorRest
{ ',' VariableDeclarator }
FormalParameter := [ 'final' ] Type Identifier BracketsOpt
FormalParameters := '(' [ FormalParameter { ',' FormalParameter } ] ')'
ForStatement :=
'for' '('
[ ForInit ] ';'
[ Expression ] ';'
[ ExpressionList ]
')' Statement
IfStatement := 'if' '(' Expression ')' Statement [ 'else' Statement ]
ImportDeclaration := 'import' ImportDeclarationBody ';'
ImportDeclarationBody := [ 'static' ] Identifier { '.' Identifier } [ '.' '*' ]
InclusiveOrExpression :=
ExclusiveOrExpression { '|' ExclusiveOrExpression }
InterfaceBody := '{' {
';' |
ModifiersOpt (
'void' Identifier MethodDeclarationRest |
'class' ClassDeclarationRest |
'interface' InterfaceDeclarationRest |
Type Identifier (
MethodDeclarationRest |
FieldDeclarationRest
)
)
} '}'
InterfaceDeclarationRest :=
Identifier
[ 'extends' ReferenceTypeList ]
InterfaceBody
LabeledStatement := Identifier ':' Statement
LocalVariableDeclarators := VariableDeclarator { ',' VariableDeclarator }
MethodBody := Block
MethodDeclarationRest :=
FormalParameters
{ '[' ']' }
[ 'throws' ReferenceTypeList ]
( ';' | MethodBody )
ModifiersOpt := { 'public' | 'protected' | 'private' | 'static' |
'abstract' | 'final' | 'native' | 'synchronized' |
'transient' | 'volatile' | 'strictfp'
MultiplicativeExpression :=
UnaryExpression { ( '*' | '/' | '%' ) UnaryExpression }
PackageDeclaration := 'package' QualifiedIdentifier ';'
PackageMemberTypeDeclaration :=
ModifiersOpt 'class' ClassDeclarationRest |
ModifiersOpt 'interface' InterfaceDeclarationRest
Primary :=
CastExpression | // CastExpression 15.16
'(' Expression ')' | // ParenthesizedExpression 15.8.5
Literal | // Literal 15.8.1
Name | // AmbiguousName
Name Arguments | // MethodInvocation
Name '[]' { '[]' } | // ArrayType 10.1
Name '[]' { '[]' } '.' 'class' | // ClassLiteral 15.8.2
'this' | // This 15.8.3
'this' Arguments | // Alternate constructor invocation 8.8.5.1
'super' Arguments | // Unqualified superclass constructor invocation 8.8.5.1
'super' '.' Identifier | // SuperclassFieldAccess 15.11.2
'super' '.' Identifier Arguments | // SuperclassMethodInvocation 15.12.4.9
NewClassInstance |
NewAnonymousClassInstance | // ClassInstanceCreationExpression 15.9
NewArray | // ArrayCreationExpression 15.10
NewInitializedArray | // ArrayInitializer 10.6
BasicType { '[]' } | // Type
BasicType { '[]' } '.' 'class' | // ClassLiteral 15.8.2
'void' '.' 'class' // ClassLiteral 15.8.2
CastExpression :=
'(' PrimitiveType { '[]' } ')' UnaryExpression |
'(' Expression ')' UnaryExpression
NewClassInstance := 'new' ReferenceType Arguments
NewAnonymousClassInstance := 'new' ReferenceType Arguments [ ClassBody ]
NewArray := 'new' Type DimExprs { '[]' }
NewInitializedArray := 'new' ArrayType ArrayInitializer
ReferenceType := QualifiedIdentifier
ReferenceTypeList := ReferenceType { ',' ReferenceType }
RelationalExpression :=
ShiftExpression {
( ( '<' | '>' | '<=' | '>=' ) ShiftExpression ) |
( 'instanceof' ReferenceType )
}
ReturnStatement := 'return' [ Expression ] ';'
Selector :=
'.' Identifier | // FieldAccess 15.11.1
'.' Identifier Arguments | // MethodInvocation
'.' 'this' // QualifiedThis 15.8.4
'.' 'super' Arguments // Qualified superclass constructor invocation (JLS 8.8.5.1)
'.' 'super' '.' Identifier | // SuperclassFieldReference (JLS 15.11.2)
'.' 'super' '.' Identifier Arguments | // SuperclassMethodInvocation (JLS 15.12.4.9)
'.' 'new' Identifier Arguments [ ClassBody ] | // QualifiedClassInstanceCreationExpression 15.9
'.' 'class'
'[' Expression ']' // ArrayAccessExpression 15.13
ShiftExpression :=
AdditiveExpression { ( '<<' | '>>' | '>>>' ) AdditiveExpression }
Statement :=
LabeledStatement |
Block |
IfStatement |
ForStatement |
WhileStatement |
DoStatement |
TryStatement |
'switch' ... |
'synchronized' ... |
ReturnStatement |
ThrowStatement |
BreakStatement |
ContinueStatement |
EmptyStatement |
ExpressionStatement
SwitchStatement :=
'switch' '(' Expression ')' '{' { SwitchLabels BlockStatements } '}'
SwitchLabels := SwitchLabels { SwitchLabels }
SwitchLabel := 'case' Expression ':' | 'default' ':'
SynchronizedStatement :=
'synchronized' '(' expression ')' Block
ThrowStatement := 'throw' Expression ';'
TryStatement :=
'try' Block Catches [ Finally ] |
'try' Block Finally
Catches := CatchClause { CatchClause }
CatchClause := 'catch' '(' FormalParameter ')' Block
Finally := 'finally' Block
Type := (
'byte' | 'short' | 'char' | 'int' | 'long' |
'float' | 'double' | 'boolean' |
ReferenceType
) { '[' ']' }
UnaryExpression :=
{ PrefixOperator } Primary { Selector } { PostfixOperator }
PrefixOperator := '++' | '--' | '+' | '-' | '~' | '!'
PostfixOperator := '++' | '--'
VariableDeclarator := Identifier VariableDeclaratorRest
VariableDeclaratorRest := { '[' ']' } [ '=' VariableInitializer ]
Used by field declarations and local variable declarations.
VariableInitializer :=
ArrayInitializer |
Expression
WhileStatement := 'while' '(' Expression ')' Statement
Notice that there is no Parser.setErrorHandler() method, but parse errors
always throw a ParseException. The reason being is that there is no reasonable
way to recover from parse errors and continue parsing, so there is no need to install
a custom parse error handler.
Parameters: optionalWarningHandler null to indicate that no warnings be issued