在本书的第7章中有很多例子中,有一堆使用这个定义定义的树步行者和听众:
public static class PropertyFileLoader extends PropretyFileBaseListener{
...
public static class PropertyFileVisitor extends PropertyFileBaseVisitor<Void>
...
为什么那里有静电?它做了什么?
上面的链接是讨论嵌套的内部类,我没有任何嵌套的内部类......我看不出使用static关键字而不使用static关键字的区别。
antlr生成的自动生成类的示例如下:
public class CymbolBaseListener implements CymbolListener {
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterVarDecl(CymbolParser.VarDeclContext ctx){ }
public interface CymbolListener extends ParseTreeListener {
/**
* Enter a parse tree produced by {@link CymbolParser#rules}.
* @param ctx the parse tree
*/
void enterVarDecl(CymbolParser.VarDeclContext ctx);
其中ParseTreeListener附带了antlr运行时ParseTreeListener
如果我想使用这些类,我会做的是以下内容:
public class MyListener extends CymbolBaseListener {
public void enterVarDecl(CymbolParser.VarDeclContext ctx)
{
System.out.println("I have found a variable declaration!");
}
}
并且获取监听器的方法是编写一个执行以下操作的静态main:
public static void main(String[] args)
{
ANTLRFileStream input = new ANTLRFileStream(args[0]);
CymbolLexer mylexer = new CymbolLexer(input);
CommonTokenStream tokens = new CommonTokenStream(mylexer);
CymbolParser myparser = new CymbolParser(tokens);
MyListener listener = new MyListener();
ParseTreeWalker walker = new ParseTreeWalker();
ParseTree tree = myparser.rules();
walker.walk(listener, tree);
}
为什么作者使大部分示例都使用static关键字:
public static class MyListener extends CymbolBaseListener
也可以使用作为非静态类。 我刚刚意识到书中的一些例子有静态关键字,而其他例子没有,但我不明白它背后的意图是什么。