IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> (Antlr4 4-2)利用监听器构建一个翻译程序(Python语言实现) -> 正文阅读

[Python知识库](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<Map<String, Integer>>')('[' ']')?
    ;

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

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

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

COMMENT: '/*' .*? '*/' -> skip ;
WS: [ \t\r\n]+ -> 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<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();
}

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:38:17  更:2022-04-26 11:39:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:21:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码