强制ANTLR从输入文件中只读取第一个注释部分并跳过其余注释

时间:2014-11-29 14:49:52

标签: java antlr antlr4 antlrworks

我的输入文件有多个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语法如下: -

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 个答案:

答案 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。