Как правильно размечается символ «@» в синтаксическом анализаторе языка Java?

Я работаю над парсером исходного кода Java, следуя лексические и синтаксические спецификации.

Однако я застрял в аннотациях; соответствующие правила:

Annotation:
    @ QualifiedIdentifier [ ( [AnnotationElement] ) ]

AnnotationTypeDeclaration:
    @ interface Identifier AnnotationTypeBody

но я не вижу символа @ нигде в лексической спецификации. Каково правильное правило для токенизации @ или где я могу найти такое правило?

Я понимаю, что могу легко добавить определение токена для этого, и это может даже работать --- иногда. Но я бы предпочел сделать это правильно в соответствии со спецификацией, если это возможно.


person Matt Fenwick    schedule 16.11.2012    source источник
comment
Интересно! Эти правила подразумевают, что @ SomeAnnotation public @ interface Foo { } допустимо, и компилятор действительно не жалуется на добавленные пробелы. Таким образом, похоже, что @ рассматривается как отдельный токен (даже несмотря на то, что обычно он отформатирован без пробела между ним и следующим токеном).   -  person Joachim Sauer    schedule 16.11.2012


Ответы (2)


В 9.6. Типы аннотаций, там написано:

Обратите внимание, что знак at (@) и ключевое слово interface — это два разных токена. Технически их можно разделить пробелами, но это не рекомендуется из соображений стиля.

person Bart Kiers    schedule 16.11.2012
comment
Как раз то, что я искал, спасибо. Будет ли очевидный способ — новый токен, который просто @ — правильным способом реализации этого токена? - person Matt Fenwick; 16.11.2012

Вы правы в том смысле, что «@» не упоминается ни как оператор, ни как пунктуация в разделе «3. Лексическая структура» JLS.

Однако он используется как символ в JLS 9.6, а также в разделе «18. Собранный синтаксис», поэтому очевидно, что ваш лексер должен рассматривать его как единое целое.

Это всего лишь небольшая редакционная проблема, которая не должна вызывать у вас беспокойства при реализации синтаксического анализатора Java.

person Stephen C    schedule 16.11.2012