是否有描述 Java 注释语法的 BNF 或 EBNF?
4 回答
Java 相关语法的权威来源当然是 JLS。
Annotations:
Annotation [Annotations]
Annotation:
@ TypeName [( [Identifier =] ElementValue)]
ElementValue:
ConditionalExpression
Annotation
ElementValueArrayInitializer
... rest ommitted
Java语言语法
任何类型都可以以 [Annotations] 为前缀:
Type: [Annotations] Identifier [TypeArguments] {. Identifier [TypeArguments]} {[]} [Annotations] BasicType
要允许在数组的级别上进行注释(在声明中,而不是在构造函数中),请将“{[]}”更改为“{[Annotations] []}”。(这在 JLS [GJSB00] 第 2 版中被抽象为“BracketsOpt”。)例如:
Type:
[Annotations] Identifier [TypeArguments]{ . Identifier [TypeArguments]} {[Annotations] []}
[Annotations] BasicType
Also permit annotations on varargs (...):
FormalParameterDeclsRest:
VariableDeclaratorId [, FormalParameterDecls]
[Annotations] ... VariableDeclaratorId
通过将“FormalParameters”(在语法中出现的所有 5 个地方)的使用更改为“FormalParameters [Annotations]”,可以在接收器类型上出现注释。例如:
VoidMethodDeclaratorRest: FormalParameters [Annotations] [throws QualifiedIdentifierList] ( MethodBody | ; )
`/* 注释语法如下。*/
注释 ::= NormalAnnotation | SingleMember注解 | MarkerAnnotation NormalAnnotation ::= "@" Name "(" ( MemberValuePairs )? ")" MarkerAnnotation ::= "@" Name SingleMemberAnnotation ::= "@" Name "(" MemberValue ")" MemberValuePairs ::= MemberValuePair ( ", " MemberValuePair )* MemberValuePair ::= "=" MemberValue MemberValue ::= 注解 | MemberValueArrayInitializer | ConditionalExpression MemberValueArrayInitializer ::= "{" ( MemberValue ( "," MemberValue )* ( "," )?)?“}”
/* 注释类型。*/
AnnotationTypeDeclaration ::= "@" "interface" AnnotationTypeBody AnnotationTypeBody ::= "{" ( AnnotationTypeMemberDeclaration )* "}" AnnotationTypeMemberDeclaration ::= Modifiers ( Type "(" ")" ( DefaultValue )? ";" | ClassOrInterfaceDeclaration | EnumDeclaration | AnnotationTypeDeclaration | FieldDeclaration ) | (";") DefaultValue ::= "default" MemberValue`从这里。另见他的博文。
这是来自官方ANTLR GitHub 存储库的 Java 注释(用法和定义)的 ANTLRv4 语法。
注解使用语法:
altAnnotationQualifiedName
: (IDENTIFIER DOT)* '@' IDENTIFIER
;
annotation
: ('@' qualifiedName | altAnnotationQualifiedName) ('(' ( elementValuePairs | elementValue )? ')')?
;
elementValuePairs
: elementValuePair (',' elementValuePair)*
;
elementValuePair
: IDENTIFIER '=' elementValue
;
elementValue
: expression
| annotation
| elementValueArrayInitializer
;
elementValueArrayInitializer
: '{' (elementValue (',' elementValue)*)? (',')? '}'
;
注解声明语法:
annotationTypeDeclaration
: '@' INTERFACE IDENTIFIER annotationTypeBody
;
annotationTypeBody
: '{' (annotationTypeElementDeclaration)* '}'
;
annotationTypeElementDeclaration
: modifier* annotationTypeElementRest
| ';' // this is not allowed by the grammar, but apparently allowed by the actual compiler
;
annotationTypeElementRest
: typeType annotationMethodOrConstantRest ';'
| classDeclaration ';'?
| interfaceDeclaration ';'?
| enumDeclaration ';'?
| annotationTypeDeclaration ';'?
;
annotationMethodOrConstantRest
: annotationMethodRest
| annotationConstantRest
;
annotationMethodRest
: IDENTIFIER '(' ')' defaultValue?
;
annotationConstantRest
: variableDeclarators
;
defaultValue
: DEFAULT elementValue
;