Заставить ANTLR читать только первый комментарийный раздел из входного файла и пропустить остальные комментарии
Мой входной файл содержит несколько комментариев в стиле JavaDoc (/** ..... */), мне нужно прочитать только самый первый закомментированный раздел и пропустить все остальные закомментированные разделы.
input.txt
/**
@Description("Hi there")
@Input("String")
*/
/**
* This is the a
* commented section that we
* don't want to read.
*/
/**
* This is the another
* commented section that we
* don't want to read.
*/
Моя грамматика лексера, как показано ниже:
lexer grammar AnnotationLexer;
ANNOTATION_START
: '/**' -> mode(INSIDE), skip
;
IGNORE
: . -> skip
;
mode INSIDE;
KEY : '@' [a-zA-Z]+ ;
STRING: '"' (~'"' | ',')* '"' ;
ANNOTATION_END
: '*/' -> mode(DEFAULT_MODE), skip
;
IGNORE_INSIDE
: [ \t\r\n] -> skip
1 ответ
Решение
Вот моя попытка (я еще не пробовал). Боюсь, что это не будет удовлетворительным, если вы на самом деле не читаете только javadocs и ничего больше:
lexer grammar AnnotationLexer;
ANNOTATION_START
: '/**' -> mode(INSIDE), skip
;
IGNORE
: . -> skip
;
mode INSIDE;
KEY : '@' [a-zA-Z]+ ;
STRING: '"' (~'"' | ',')* '"' ;
ANNOTATION_END
: '*/' -> mode(READ_JAVADOC), skip
;
IGNORE_INSIDE
: [ \t\r\n] -> skip
mode READ_JAVADOC;
JAVADOC_START_AFTER_FIRST
: '/**' skip
;
IGNORE_INSIDE_AFTER_FIRST
: [ \t\r\n] -> skip
;
JAVADOC_END_AFTER_FIRST
: '*/' skip
;
Практически таким образом вы должны создать все правила лексера два раза. Вероятно, в этом случае лучше использовать семантические предикаты (с изменяемыми полями-членами для состояния, описывающего, сколько javadoc было прочитано) вместо mode
s.