【问题标题】:How is the '@' symbol correctly tokenized in a Java language parser?如何在 Java 语言解析器中正确标记“@”符号?
【发布时间】:2012-11-05 06:54:37
【问题描述】:

我正在开发 Java 源代码解析器,遵循 lexicalsyntactic 规范。

不过,我被困在注释上;相关规则是:

Annotation:
    @ QualifiedIdentifier [ ( [AnnotationElement] ) ]

AnnotationTypeDeclaration:
    @ interface Identifier AnnotationTypeBody

但我在词汇规范中的任何地方都没有看到@ 符号。标记@ 的正确规则是什么,或者我在哪里可以找到这样的规则?

我意识到我可以很容易地为此添加一个令牌定义,它甚至可能会起作用 --- 有时。但如果可能的话,我宁愿按照规范正确地做。

【问题讨论】:

  • 有趣!这些规则意味着@ SomeAnnotation public @ interface Foo { } 是有效的,并且实际上编译器似乎并没有抱怨添加的空格。所以看起来@ 被视为一个单独的标记(即使它通常被格式化为在它和下一个标记之间没有空格)。

标签: java parsing grammar token language-details


【解决方案1】:

9.6. Annotation Types 中,它说:

请注意,at 符号 (@) 和关键字接口是两个不同的标记。从技术上讲,可以用空格分隔它们,但出于风格问题,不鼓励这样做。

【讨论】:

  • 正是我想要的,谢谢。显而易见的方式——一个只是@的新令牌——是实现这个令牌的正确方法吗?
【解决方案2】:

您是对的,因为在 JLS 的“3. 词法结构”部分中没有将“@”作为运算符或标点符号提及。

但是,它在 JLS 9.6 和“18. Collected Syntax”部分中用作符号,因此很明显您的词法分析器应该将其视为一个符号。

这只是一个小的编辑问题,在实现 Java 解析器时不会引起您的任何担忧。

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 2023-04-07
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多