栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

(Antlr4 4-2)利用监听器构建一个翻译程序(Python语言实现)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(Antlr4 4-2)利用监听器构建一个翻译程序(Python语言实现)

本节实现将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>')('[' ']')?
    ;

methodDeclarationRest
    : '{' ('return' 'null' ';')? '}'
    ;

formalParameters
    : '(' (datatype Identifier (',' datatype Identifier)*)? ')'
    ;

Identifier: [a-zA-Z_]+ [a-zA-Z0-9_]* ;

COMMENT: '' -> skip ;
WS: [ trn]+ -> skip ;
监听器代码

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>[] h() { return null; }
}
运行结果
(venv) D:PythonProjectslearnAntlr05>python ExtractInterfaceTool.py Demo.txt
interface IDemo {
        void f(intx,Stringy);
        int[] g();
        List>[] h();
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836366.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号