'@';在Java语言解析器中正确标记符号?
我正在开发一个Java源代码解析器,遵循和规范 不过,我还是被注释卡住了;有关规则如下:'@';在Java语言解析器中正确标记符号?,java,parsing,grammar,token,language-details,Java,Parsing,Grammar,Token,Language Details,我正在开发一个Java源代码解析器,遵循和规范 不过,我还是被注释卡住了;有关规则如下: Annotation: @ QualifiedIdentifier [ ( [AnnotationElement] ) ] AnnotationTypeDeclaration: @ interface Identifier AnnotationTypeBody 但是我在词法规范中没有看到提到的@符号。标记@的正确规则是什么,或者在哪里可以找到这样的规则 我意识到我可以很容易地为此添加一个
Annotation:
@ QualifiedIdentifier [ ( [AnnotationElement] ) ]
AnnotationTypeDeclaration:
@ interface Identifier AnnotationTypeBody
但是我在词法规范中没有看到提到的@
符号。标记@
的正确规则是什么,或者在哪里可以找到这样的规则
我意识到我可以很容易地为此添加一个标记定义,它甚至可以工作——有时。但如果可能的话,我更愿意按照规范正确操作。在中,它说:
请注意,at符号(@)和关键字接口是两个不同的标记。从技术上讲,可以用空格分隔它们,但从风格上讲,这是不可取的
您是正确的,因为在JLS的“3.词汇结构”部分中,“@”既不是运算符也不是标点符号 但是,它在JLS 9.6以及“18.Collected Syntax”部分中用作一个符号,因此很明显,您的lexer应该将其视为一个符号
这只是一个次要的编辑问题,在实现Java解析器时不应该引起任何关注。有趣!这些规则意味着
@SomeAnnotation public@interface Foo{}
是有效的,而且编译器似乎并不抱怨添加的空白。所以它看起来像是一个单独的令牌(尽管它的格式通常在它和下一个令牌之间没有空格)。这正是我想要的,谢谢。显而易见的方法——一个新的令牌,它只是@
——是实现这个令牌的正确方法吗?