请注意,您可以简单地执行以下操作:
getText().substring(2, getText().length()-2)
在COMMENT
令牌上,因为第一个和最后两个字符将始终是/*
and */
。
您也可以删除,options {greedy=false;} :
因为两者.*
都是不贪婪.+
的(尽管没有.
它们是贪婪的)(i)。
编辑
或setText(...)
在Comment
令牌上使用以立即丢弃/*
and */
。一个小演示:
文件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)权威 ANTLR 参考,第 4 章,扩展 BNF 子规则,第 86 页。