Обратите внимание, что вы можете просто сделать:
getText().substring(2, getText().length()-2)
на COMMENT
токене , поскольку первые и последние 2 символа всегда будут /*
и */
.
Вы также можете удалить options {greedy=false;} :
, так как и .*
, и .+
являются жадными (хотя без .
они являются жадными) (i).
EDIT
Или используйте setText(...)
на токене Comment
, чтобы немедленно сбросить /*
и */
. Немного демо:
файл T.g
:
grammar T;
@parser::members {
public static void main(String[] args) throws Exception {
ANTLRStringStream in = new ANTLRStringStream(
"/* abc */ \n" +
" \n" +
"/* \n" +
" DEF \n" +
"*/ "
);
TLexer lexer = new TLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
TParser parser = new TParser(tokens);
parser.parse();
}
}
parse
: ( Comment {System.out.printf("parsed :: >\%s<\%n", $Comment.getText());} )+ EOF
;
Comment
: '/*' .* '*/' {setText(getText().substring(2, getText().length()-2));}
;
Space
: (' ' | '\t' | '\r' | '\n') {skip();}
;
Затем сгенерируйте парсер и лексер, скомпилируйте все файлы .java и запустите парсер, содержащий основной метод:
java -cp antlr-3.2.jar org.antlr.Tool T.g
javac -cp antlr-3.2.jar *.java
java -cp .:antlr-3.2.jar TParser
(or `java -cp .;antlr-3.2.jar TParser` on Windows)
, который выдаст следующий вывод:
parsed :: > abc <
parsed :: >
DEF
<
(i) Полное руководство по ANTLR , глава 4, Расширенные BNF-субрулы, стр. 86.