2

是否有描述 Java 注释语法的 BNF 或 EBNF?

4

4 回答 4

4

Java 相关语法的权威来源当然是 JLS。

JLS 18.1 Java 编程语言的语法

Annotations:
        Annotation [Annotations]

Annotation:
        @ TypeName [( [Identifier =] ElementValue)]

ElementValue:
        ConditionalExpression
        Annotation
        ElementValueArrayInitializer

... rest ommitted
于 2010-03-22T01:15:24.717 回答
1

Java语言语法

  1. 任何类型都可以以 [Annotations] 为前缀:

    Type: [Annotations] Identifier [TypeArguments] {. Identifier [TypeArguments]} {[]} [Annotations] BasicType

  2. 要允许在数组的级别上进行注释(在声明中,而不是在构造函数中),请将“{[]}”更改为“{[Annotations] []}”。(这在 JLS [GJSB00] 第 2 版中被抽象为“BracketsOpt”。)例如:

Type: [Annotations] Identifier [TypeArguments]{ . Identifier [TypeArguments]} {[Annotations] []} [Annotations] BasicType

Also permit annotations on varargs (...): FormalParameterDeclsRest: VariableDeclaratorId [, FormalParameterDecls] [Annotations] ... VariableDeclaratorId

  1. 通过将“FormalParameters”(在语法中出现的所有 5 个地方)的使用更改为“FormalParameters [Annotations]”,可以在接收器类型上出现注释。例如:

    VoidMethodDeclaratorRest: FormalParameters [Annotations] [throws QualifiedIdentifierList] ( MethodBody | ; )

于 2010-03-22T01:25:31.250 回答
1

`/* 注释语法如下。*/

注释 ::= 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`从这里。另见他的博文

于 2010-03-22T01:01:36.730 回答
0

这是来自官方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
    ;
于 2021-11-10T10:12:49.693 回答