我在 .java 文件中有 ANTLR 3 的 Parser 和 Lexer 的 Java 源代码,并希望查看所有规则等背后的实际语法。
甚至可能吗?
不是通过某些自动化工具(AFAIK)。但是生成的源文件在其注释中包含原始语法的解析器和词法分析器规则,因此您可以自己合理地轻松地对它们进行逆向工程。
例如,采用这个虚拟语法:
grammar T;
parse
: foo
| bar
| OTHER
;
foo : INT ;
bar : ALPHA ;
INT : '0'..'9'+ ;
ALPHA : ('a'..'z' | 'A'..'Z')+ ;
OTHER : . ;
如果您从中生成词法分析器和解析器,则解析器将如下所示:
public class TParser extends Parser {
// $ANTLR start "parse"
// T.g:3:1: parse : ( foo | bar | OTHER );
public final void parse() throws RecognitionException {
...
}
// $ANTLR end "parse"
// $ANTLR start "foo"
// T.g:9:1: foo : INT ;
public final void foo() throws RecognitionException {
...
}
// $ANTLR end "foo"
// $ANTLR start "bar"
// T.g:10:1: bar : ALPHA ;
public final void bar() throws RecognitionException {
...
}
// $ANTLR end "bar"
}
和这样的词法分析器:
public class TLexer extends Lexer {
// $ANTLR start "INT"
public final void mINT() throws RecognitionException {
// T.g:12:7: ( ( '0' .. '9' )+ )
...
}
// $ANTLR end "INT"
// $ANTLR start "ALPHA"
public final void mALPHA() throws RecognitionException {
// T.g:13:7: ( ( 'a' .. 'z' | 'A' .. 'Z' )+ )
...
}
// $ANTLR end "ALPHA"
// $ANTLR start "OTHER"
public final void mOTHER() throws RecognitionException {
// T.g:14:7: ( . )
...
}
// $ANTLR end "OTHER"
}
如您所见,所有语法规则都在 .java 源文件的注释中。