本节实现将Java类中的全部方法抽取出来,生成一个接口文件,使用监听器的方式。
访问器与监听器的最大区别在于:
监听器的方法会被ANTLR提供的遍历器对象自动调用而访问器中,必须显示的调用visit方法来访问子节点。忘记调用的后果就是对应的子树将不会被访问。
005/Java.g4
grammar Java;
classDeclaration
: 'class' Identifier classBody
;
methodDeclaration
: datatype Identifier formalParameters methodDeclarationRest
| 'void' Identifier formalParameters methodDeclarationRest
;
classBody
: '{' methodDeclaration* '}'
;
datatype
: ('int' | 'String'|'List
监听器代码
005/ExtractInterfaceListener.py
from JavaListener import JavaListener
from JavaParser import JavaParser
class ExtractInterfaceListener(JavaListener):
def __init__(self, parser: JavaParser):
self.parser = parser
def enterClassDeclaration(self, ctx:JavaParser.ClassDeclarationContext):
print("interface I" + ctx.Identifier().getText() + " {")
def exitClassDeclaration(self, ctx:JavaParser.ClassDeclarationContext):
print("}")
def enterMethodDeclaration(self, ctx:JavaParser.MethodDeclarationContext):
datatype = 'void'
if ctx.datatype() is not None:
datatype = ctx.datatype().getText()
args = ctx.formalParameters().getText()
print("\t"+datatype+" "+ctx.Identifier().getText()+args+";")
主程序代码
import sys
from antlr4 import *
from JavaLexer import JavaLexer
from JavaParser import JavaParser
from ExtractInterfaceListener import ExtractInterfaceListener
input_ = FileStream(sys.argv[1])
lexer = JavaLexer(input_)
tokens = CommonTokenStream(lexer)
parser = JavaParser(tokens)
tree = parser.classDeclaration()
walker = ParseTreeWalker()
extractor = ExtractInterfaceListener(parser)
walker.walk(extractor, tree)
测试文件
005/Demo.txt
class Demo {
void f(int x, String y) {}
int[] g() { return null; }
List<Map<String, Integer>>[] h() { return null; }
}
运行结果
(venv) D:\PythonProjects\learnAntlr\005>python ExtractInterfaceTool.py Demo.txt
interface IDemo {
void f(intx,Stringy);
int[] g();
List<Map<String, Integer>>[] h();
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)