forked from jasder/antlr
adding left-recursive parser
[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 9467]
This commit is contained in:
parent
b83da61f52
commit
36a7597bcf
|
@ -0,0 +1,615 @@
|
|||
ûparser grammar JavaParserLR;
|
||||
options {tokenVocab=JavaLexer;}
|
||||
|
||||
// starting point for parsing a java file
|
||||
/* The annotations are separated out to make parsing faster, but must be associated with
|
||||
a packageDeclaration or a typeDeclaration (and not an empty one). */
|
||||
compilationUnit
|
||||
: annotations
|
||||
( packageDeclaration importDeclaration* typeDeclaration*
|
||||
| classOrInterfaceDeclaration typeDeclaration*
|
||||
)
|
||||
| packageDeclaration? importDeclaration* typeDeclaration*
|
||||
;
|
||||
|
||||
packageDeclaration
|
||||
: 'package' qualifiedName ';'
|
||||
;
|
||||
|
||||
importDeclaration
|
||||
: 'import' 'static'? qualifiedName ('.' '*')? ';'
|
||||
;
|
||||
|
||||
typeDeclaration
|
||||
: classOrInterfaceDeclaration
|
||||
| ';'
|
||||
;
|
||||
|
||||
classOrInterfaceDeclaration
|
||||
: classOrInterfaceModifiers (classDeclaration | interfaceDeclaration)
|
||||
;
|
||||
|
||||
classOrInterfaceModifiers
|
||||
: classOrInterfaceModifier*
|
||||
;
|
||||
|
||||
classOrInterfaceModifier
|
||||
: annotation // class or interface
|
||||
| 'public' // class or interface
|
||||
| 'protected' // class or interface
|
||||
| 'private' // class or interface
|
||||
| 'abstract' // class or interface
|
||||
| 'static' // class or interface
|
||||
| 'final' // class only -- does not apply to interfaces
|
||||
| 'strictfp' // class or interface
|
||||
;
|
||||
|
||||
modifiers
|
||||
: modifier*
|
||||
;
|
||||
|
||||
classDeclaration
|
||||
: normalClassDeclaration
|
||||
| enumDeclaration
|
||||
;
|
||||
|
||||
normalClassDeclaration
|
||||
: 'class' Identifier typeParameters?
|
||||
('extends' type)?
|
||||
('implements' typeList)?
|
||||
classBody
|
||||
;
|
||||
|
||||
typeParameters
|
||||
: '<' typeParameter (',' typeParameter)* '>'
|
||||
;
|
||||
|
||||
typeParameter
|
||||
: Identifier ('extends' typeBound)?
|
||||
;
|
||||
|
||||
typeBound
|
||||
: type ('&' type)*
|
||||
;
|
||||
|
||||
enumDeclaration
|
||||
: ENUM Identifier ('implements' typeList)? enumBody
|
||||
;
|
||||
|
||||
enumBody
|
||||
: '{' enumConstants? ','? enumBodyDeclarations? '}'
|
||||
;
|
||||
|
||||
enumConstants
|
||||
: enumConstant (',' enumConstant)*
|
||||
;
|
||||
|
||||
enumConstant
|
||||
: annotations? Identifier arguments? classBody?
|
||||
;
|
||||
|
||||
enumBodyDeclarations
|
||||
: ';' (classBodyDeclaration)*
|
||||
;
|
||||
|
||||
interfaceDeclaration
|
||||
: normalInterfaceDeclaration
|
||||
| annotationTypeDeclaration
|
||||
;
|
||||
|
||||
normalInterfaceDeclaration
|
||||
: 'interface' Identifier typeParameters? ('extends' typeList)? interfaceBody
|
||||
;
|
||||
|
||||
typeList
|
||||
: type (',' type)*
|
||||
;
|
||||
|
||||
classBody
|
||||
: '{' classBodyDeclaration* '}'
|
||||
;
|
||||
|
||||
interfaceBody
|
||||
: '{' interfaceBodyDeclaration* '}'
|
||||
;
|
||||
|
||||
classBodyDeclaration
|
||||
: ';'
|
||||
| 'static'? block
|
||||
| modifiers memberDecl
|
||||
;
|
||||
|
||||
memberDecl
|
||||
: genericMethodOrConstructorDecl
|
||||
| memberDeclaration
|
||||
| 'void' Identifier voidMethodDeclaratorRest
|
||||
| Identifier constructorDeclaratorRest
|
||||
| interfaceDeclaration
|
||||
| classDeclaration
|
||||
;
|
||||
|
||||
memberDeclaration
|
||||
: type (methodDeclaration | fieldDeclaration)
|
||||
;
|
||||
|
||||
genericMethodOrConstructorDecl
|
||||
: typeParameters genericMethodOrConstructorRest
|
||||
;
|
||||
|
||||
genericMethodOrConstructorRest
|
||||
: (type | 'void') Identifier methodDeclaratorRest
|
||||
| Identifier constructorDeclaratorRest
|
||||
;
|
||||
|
||||
methodDeclaration
|
||||
: Identifier methodDeclaratorRest
|
||||
;
|
||||
|
||||
fieldDeclaration
|
||||
: variableDeclarators ';'
|
||||
;
|
||||
|
||||
interfaceBodyDeclaration
|
||||
: modifiers interfaceMemberDecl
|
||||
| ';'
|
||||
;
|
||||
|
||||
interfaceMemberDecl
|
||||
: interfaceMethodOrFieldDecl
|
||||
| interfaceGenericMethodDecl
|
||||
| 'void' Identifier voidInterfaceMethodDeclaratorRest
|
||||
| interfaceDeclaration
|
||||
| classDeclaration
|
||||
;
|
||||
|
||||
interfaceMethodOrFieldDecl
|
||||
: type Identifier interfaceMethodOrFieldRest
|
||||
;
|
||||
|
||||
interfaceMethodOrFieldRest
|
||||
: constantDeclaratorsRest ';'
|
||||
| interfaceMethodDeclaratorRest
|
||||
;
|
||||
|
||||
methodDeclaratorRest
|
||||
: formalParameters ('[' ']')*
|
||||
('throws' qualifiedNameList)?
|
||||
( methodBody
|
||||
| ';'
|
||||
)
|
||||
;
|
||||
|
||||
voidMethodDeclaratorRest
|
||||
: formalParameters ('throws' qualifiedNameList)?
|
||||
( methodBody
|
||||
| ';'
|
||||
)
|
||||
;
|
||||
|
||||
interfaceMethodDeclaratorRest
|
||||
: formalParameters ('[' ']')* ('throws' qualifiedNameList)? ';'
|
||||
;
|
||||
|
||||
interfaceGenericMethodDecl
|
||||
: typeParameters (type | 'void') Identifier
|
||||
interfaceMethodDeclaratorRest
|
||||
;
|
||||
|
||||
voidInterfaceMethodDeclaratorRest
|
||||
: formalParameters ('throws' qualifiedNameList)? ';'
|
||||
;
|
||||
|
||||
constructorDeclaratorRest
|
||||
: formalParameters ('throws' qualifiedNameList)? constructorBody
|
||||
;
|
||||
|
||||
constantDeclarator
|
||||
: Identifier constantDeclaratorRest
|
||||
;
|
||||
|
||||
variableDeclarators
|
||||
: variableDeclarator (',' variableDeclarator)*
|
||||
;
|
||||
|
||||
variableDeclarator
|
||||
: variableDeclaratorId ('=' variableInitializer)?
|
||||
;
|
||||
|
||||
constantDeclaratorsRest
|
||||
: constantDeclaratorRest (',' constantDeclarator)*
|
||||
;
|
||||
|
||||
constantDeclaratorRest
|
||||
: ('[' ']')* '=' variableInitializer
|
||||
;
|
||||
|
||||
variableDeclaratorId
|
||||
: Identifier ('[' ']')*
|
||||
;
|
||||
|
||||
variableInitializer
|
||||
: arrayInitializer
|
||||
| expression
|
||||
;
|
||||
|
||||
arrayInitializer
|
||||
: '{' (variableInitializer (',' variableInitializer)* (',')? )? '}'
|
||||
;
|
||||
|
||||
modifier
|
||||
: annotation
|
||||
| 'public'
|
||||
| 'protected'
|
||||
| 'private'
|
||||
| 'static'
|
||||
| 'abstract'
|
||||
| 'final'
|
||||
| 'native'
|
||||
| 'synchronized'
|
||||
| 'transient'
|
||||
| 'volatile'
|
||||
| 'strictfp'
|
||||
;
|
||||
|
||||
packageOrTypeName
|
||||
: qualifiedName
|
||||
;
|
||||
|
||||
enumConstantName
|
||||
: Identifier
|
||||
;
|
||||
|
||||
typeName
|
||||
: qualifiedName
|
||||
;
|
||||
|
||||
type
|
||||
: classOrInterfaceType ('[' ']')*
|
||||
| primitiveType ('[' ']')*
|
||||
;
|
||||
|
||||
classOrInterfaceType
|
||||
: Identifier typeArguments? ('.' Identifier typeArguments? )*
|
||||
;
|
||||
|
||||
primitiveType
|
||||
: 'boolean'
|
||||
| 'char'
|
||||
| 'byte'
|
||||
| 'short'
|
||||
| 'int'
|
||||
| 'long'
|
||||
| 'float'
|
||||
| 'double'
|
||||
;
|
||||
|
||||
variableModifier
|
||||
: 'final'
|
||||
| annotation
|
||||
;
|
||||
|
||||
typeArguments
|
||||
: '<' typeArgument (',' typeArgument)* '>'
|
||||
;
|
||||
|
||||
typeArgument
|
||||
: type
|
||||
| '?' (('extends' | 'super') type)?
|
||||
;
|
||||
|
||||
qualifiedNameList
|
||||
: qualifiedName (',' qualifiedName)*
|
||||
;
|
||||
|
||||
formalParameters
|
||||
: '(' formalParameterDecls? ')'
|
||||
;
|
||||
|
||||
formalParameterDecls
|
||||
: variableModifiers type formalParameterDeclsRest
|
||||
;
|
||||
|
||||
formalParameterDeclsRest
|
||||
: variableDeclaratorId (',' formalParameterDecls)?
|
||||
| '...' variableDeclaratorId
|
||||
;
|
||||
|
||||
methodBody
|
||||
: block
|
||||
;
|
||||
|
||||
constructorBody
|
||||
: '{' explicitConstructorInvocation? blockStatement* '}'
|
||||
;
|
||||
|
||||
explicitConstructorInvocation
|
||||
: nonWildcardTypeArguments? ('this' | 'super') arguments ';'
|
||||
| expression '.' nonWildcardTypeArguments? 'super' arguments ';'
|
||||
;
|
||||
|
||||
qualifiedName
|
||||
: Identifier ('.' Identifier)*
|
||||
;
|
||||
|
||||
literal
|
||||
: integerLiteral
|
||||
| FloatingPointLiteral
|
||||
| CharacterLiteral
|
||||
| StringLiteral
|
||||
| booleanLiteral
|
||||
| 'null'
|
||||
;
|
||||
|
||||
integerLiteral
|
||||
: HexLiteral
|
||||
| OctalLiteral
|
||||
| DecimalLiteral
|
||||
;
|
||||
|
||||
booleanLiteral
|
||||
: 'true'
|
||||
| 'false'
|
||||
;
|
||||
|
||||
// ANNOTATIONS
|
||||
|
||||
annotations
|
||||
: annotation+
|
||||
;
|
||||
|
||||
annotation
|
||||
: '@' annotationName ( '(' ( elementValuePairs | elementValue )? ')' )?
|
||||
;
|
||||
|
||||
annotationName
|
||||
: Identifier ('.' Identifier)*
|
||||
;
|
||||
|
||||
elementValuePairs
|
||||
: elementValuePair (',' elementValuePair)*
|
||||
;
|
||||
|
||||
elementValuePair
|
||||
: Identifier '=' elementValue
|
||||
;
|
||||
|
||||
elementValue
|
||||
: expression
|
||||
| annotation
|
||||
| elementValueArrayInitializer
|
||||
;
|
||||
|
||||
elementValueArrayInitializer
|
||||
: '{' (elementValue (',' elementValue)*)? (',')? '}'
|
||||
;
|
||||
|
||||
annotationTypeDeclaration
|
||||
: '@' 'interface' Identifier annotationTypeBody
|
||||
;
|
||||
|
||||
annotationTypeBody
|
||||
: '{' (annotationTypeElementDeclaration)* '}'
|
||||
;
|
||||
|
||||
annotationTypeElementDeclaration
|
||||
: modifiers annotationTypeElementRest
|
||||
;
|
||||
|
||||
annotationTypeElementRest
|
||||
: type annotationMethodOrConstantRest ';'
|
||||
| normalClassDeclaration ';'?
|
||||
| normalInterfaceDeclaration ';'?
|
||||
| enumDeclaration ';'?
|
||||
| annotationTypeDeclaration ';'?
|
||||
;
|
||||
|
||||
annotationMethodOrConstantRest
|
||||
: annotationMethodRest
|
||||
| annotationConstantRest
|
||||
;
|
||||
|
||||
annotationMethodRest
|
||||
: Identifier '(' ')' defaultValue?
|
||||
;
|
||||
|
||||
annotationConstantRest
|
||||
: variableDeclarators
|
||||
;
|
||||
|
||||
defaultValue
|
||||
: 'default' elementValue
|
||||
;
|
||||
|
||||
// STATEMENTS / BLOCKS
|
||||
|
||||
block
|
||||
: '{' blockStatement* '}'
|
||||
;
|
||||
|
||||
blockStatement
|
||||
: localVariableDeclarationStatement
|
||||
| classOrInterfaceDeclaration
|
||||
| statement
|
||||
;
|
||||
|
||||
localVariableDeclarationStatement
|
||||
: localVariableDeclaration ';'
|
||||
;
|
||||
|
||||
localVariableDeclaration
|
||||
: variableModifiers type variableDeclarators
|
||||
;
|
||||
|
||||
variableModifiers
|
||||
: variableModifier*
|
||||
;
|
||||
|
||||
statement
|
||||
: block
|
||||
| ASSERT expression (':' expression)? ';'
|
||||
| 'if' parExpression statement ('else' statement)?
|
||||
| 'for' '(' forControl ')' statement
|
||||
| 'while' parExpression statement
|
||||
| 'do' statement 'while' parExpression ';'
|
||||
| 'try' block
|
||||
( catches 'finally' block
|
||||
| catches
|
||||
| 'finally' block
|
||||
)
|
||||
| 'switch' parExpression '{' switchBlockStatementGroups '}'
|
||||
| 'synchronized' parExpression block
|
||||
| 'return' expression? ';'
|
||||
| 'throw' expression ';'
|
||||
| 'break' Identifier? ';'
|
||||
| 'continue' Identifier? ';'
|
||||
| ';'
|
||||
| statementExpression ';'
|
||||
| Identifier ':' statement
|
||||
;
|
||||
|
||||
catches
|
||||
: catchClause (catchClause)*
|
||||
;
|
||||
|
||||
catchClause
|
||||
: 'catch' '(' formalParameter ')' block
|
||||
;
|
||||
|
||||
formalParameter
|
||||
: variableModifiers type variableDeclaratorId
|
||||
;
|
||||
|
||||
switchBlockStatementGroups
|
||||
: (switchBlockStatementGroup)*
|
||||
;
|
||||
|
||||
/* The change here (switchLabel -> switchLabel+) technically makes this grammar
|
||||
ambiguous; but with appropriately greedy parsing it yields the most
|
||||
appropriate AST, one in which each group, except possibly the last one, has
|
||||
labels and statements. */
|
||||
switchBlockStatementGroup
|
||||
: switchLabel+ blockStatement*
|
||||
;
|
||||
|
||||
switchLabel
|
||||
: 'case' constantExpression ':'
|
||||
| 'case' enumConstantName ':'
|
||||
| 'default' ':'
|
||||
;
|
||||
|
||||
forControl
|
||||
: enhancedForControl
|
||||
| forInit? ';' expression? ';' forUpdate?
|
||||
;
|
||||
|
||||
forInit
|
||||
: localVariableDeclaration
|
||||
| expressionList
|
||||
;
|
||||
|
||||
enhancedForControl
|
||||
: variableModifiers type Identifier ':' expression
|
||||
;
|
||||
|
||||
forUpdate
|
||||
: expressionList
|
||||
;
|
||||
|
||||
// EXPRESSIONS
|
||||
|
||||
parExpression
|
||||
: '(' expression ')'
|
||||
;
|
||||
|
||||
expressionList
|
||||
: expression (',' expression)*
|
||||
;
|
||||
|
||||
statementExpression
|
||||
: expression
|
||||
;
|
||||
|
||||
constantExpression
|
||||
: expression
|
||||
;
|
||||
|
||||
expression
|
||||
: '(' expression ')'
|
||||
| 'this'
|
||||
| 'super'
|
||||
| integerLiteral
|
||||
| Identifier
|
||||
| type '.' 'class'
|
||||
| expression '.' Identifier
|
||||
| expression '.' 'this'
|
||||
| expression '.' 'super' '(' expressionList? ')'
|
||||
| expression '.' 'new' Identifier '(' expressionList? ')'
|
||||
| creator
|
||||
// | 'new' type ( '(' expressionList? ')' | ('[' expression ']')+)
|
||||
| expression '[' expression ']'
|
||||
| '(' type ')' expression
|
||||
| expression ('++' | '--')
|
||||
| expression '(' expressionList? ')'
|
||||
| ('+'|'-'|'++'|'--') expression
|
||||
| ('~'|'!') expression
|
||||
| expression ('*'|'/'|'%') expression
|
||||
| expression ('+'|'-') expression
|
||||
| expression ('<<' | '>>>' | '>>') expression
|
||||
| expression ('<=' | '>=' | '>' | '<') expression
|
||||
| expression 'instanceof' expression
|
||||
| expression ('==' | '=') expression
|
||||
| expression '&' expression
|
||||
| expression '^'<assoc=right> expression
|
||||
| expression '|' expression
|
||||
| expression '&&' expression
|
||||
| expression '||' expression
|
||||
| expression '?' expression ':' expression
|
||||
| expression
|
||||
('='<assoc=right>
|
||||
|'+='<assoc=right>
|
||||
|'-='<assoc=right>
|
||||
|'*='<assoc=right>
|
||||
|'/='<assoc=right>
|
||||
|'&='<assoc=right>
|
||||
|'|='<assoc=right>
|
||||
|'='<assoc=right>
|
||||
|'>' '>' '='<assoc=right>
|
||||
|'>' '>' '>' '='<assoc=right>
|
||||
|'<' '<' '='<assoc=right>
|
||||
|'%='<assoc=right>
|
||||
)
|
||||
expression
|
||||
;
|
||||
|
||||
creator
|
||||
: nonWildcardTypeArguments createdName classCreatorRest
|
||||
| createdName (arrayCreatorRest | classCreatorRest)
|
||||
;
|
||||
|
||||
createdName
|
||||
: classOrInterfaceType
|
||||
| primitiveType
|
||||
;
|
||||
|
||||
innerCreator
|
||||
: nonWildcardTypeArguments? Identifier classCreatorRest
|
||||
;
|
||||
|
||||
arrayCreatorRest
|
||||
: '['
|
||||
( ']' ('[' ']')* arrayInitializer
|
||||
| expression ']' ('[' expression ']')* ('[' ']')*
|
||||
)
|
||||
;
|
||||
|
||||
classCreatorRest
|
||||
: arguments classBody?
|
||||
;
|
||||
|
||||
nonWildcardTypeArguments
|
||||
: '<' typeList '>'
|
||||
;
|
||||
|
||||
arguments
|
||||
: '(' expressionList? ')'
|
||||
;
|
Loading…
Reference in New Issue