java-在ANTLR中BaseListner的方法和词法规则的关系0.5.0
环境介绍
- java.g4
- idea
- windows10
词法规则与类方法的对应关系
随便找一个词法规则,如ClassOrInterfaceModifier,参考java.g4文件定义如下
java
classOrInterfaceModifier
: annotation // class or interface
| ( 'public' // class or interface
| 'protected' // class or interface
| 'private' // class or interface
| 'static' // class or interface
| 'abstract' // class or interface
| 'final' // class only -- does not apply to interfaces
| 'strictfp' // class or interface
)
;
在BaseListner生成后,就会生产对应的两个方法一个enter,一个是exit如下
java
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterClassOrInterfaceModifier(JavaParser.ClassOrInterfaceModifierContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitClassOrInterfaceModifier(JavaParser.ClassOrInterfaceModifierContext ctx) { }
ClassOrInterfaceModifierContext与词法对应关系
ClassOrInterfaceModifierContext在BaseListener中缩写为ctx,这个ctx就表示的整个的词法规则,因此我们可以通过如下方法访问具体的规则:
-
以如下类名public static class myVisitor extends HelloBaseVisitor中的public和static为例,遍历public static时会两次触发listener
-
访问ctx.PUBLIC(): 获取当前是否是public,如果是static就返回public,不是public,就会返回为null
-
访问ctx.STATIC(): 获取当前是否是static,如果是static就返回static,不是static,就会返回为null
-
也可以使用ctx.annotation()去访问规则的另外一个备选分支
参考
java.g4文件获取以及BaseListner的生成可以参考