我的输入文件有多个JavaDoc样式注释(/ ** ..... * /),我只需要阅读第一个注释部分,并跳过其余所有注释部分。
/**
@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语法如下: -
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
答案 0 :(得分: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
;
实际上,您必须两次创建所有词法规则。可能最好在这种情况下使用semantic predicates(使用可变成员字段来描述读取了多少javadoc的状态)而不是mode
s。