Заставить 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 было прочитано) вместо modes.

Другие вопросы по тегам