簡単にできることに注意してください:
getText().substring(2, getText().length()-2)
最初と最後の 2 文字は常に and であるため、トークンCOMMENT
では./*
*/
とのoptions {greedy=false;} :
両方が貪欲でないため、 を削除することもできます(ただし、 がなければ貪欲です) (i)。.*
.+
.
編集
またはsetText(...)
、トークンで使用してand をすぐ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 ファイルをコンパイルして、main メソッドを含むパーサーを実行します。
java -cp antlr-3.2.jar org.antlr.Tool Tg
javac -cp antlr-3.2.jar *.java
java -cp .:antlr-3.2.jar TParser
(または Windows では「java -cp .;antlr-3.2.jar TParser」)
次の出力が生成されます。
parsed :: > abc <
parsed :: >
DEF
<
(i) The Definitive ANTLR Reference、第 4 章、拡張 BNF サブルール、86 ページ。