Как символ '@' правильно маркируется в синтаксическом анализаторе языка Java?
Я работаю над анализатором исходного кода Java, следуя лексическим и синтаксическим спецификациям.
Я застрял на аннотации, хотя; соответствующие правила:
Annotation:
@ QualifiedIdentifier [ ( [AnnotationElement] ) ]
AnnotationTypeDeclaration:
@ interface Identifier AnnotationTypeBody
но я не вижу @
Символ упоминается в любом месте лексической спецификации. Какое правильное правило для токенизации @
или где найти такое правило?
Я понимаю, что мог бы легко добавить определение токена для этого, и это может даже работать - иногда. Но я бы предпочел сделать это правильно в соответствии со спецификацией, если это возможно.
2 ответа
В 9.6. Типы аннотаций, он говорит:
Обратите внимание, что at-sign (@) и ключевое слово interface являются двумя разными токенами. Технически их можно разделить пробелами, но это не рекомендуется как вопрос стиля.
Вы правы в том смысле, что "@" не упоминается ни как оператор, ни как пунктуация в разделе "3. Лексическая структура" JLS.
Однако он используется как символ в JLS 9.6, а также в разделе "18. Собранный синтаксис", поэтому очевидно, что ваш лексер должен рассматривать его как единое целое.
Это всего лишь небольшая редакционная проблема, и она не должна вызывать у вас беспокойства при реализации синтаксического анализатора Java.