python ast 解析enum为C头文件

这篇具有很好参考价值的文章主要介绍了python ast 解析enum为C头文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

from _ast import Assign, ClassDef, FunctionDef, Import
import ast
from typing import Any

str="""
import enum

class MsgIdEnum(enum.Enum):
    MSG_ID_1 = (1, "消息1")
    MSG_ID_5 = (5, "消息5")
    MSG_ID_6 = (enum.auto(), "消息6")
    MSG_ID_7 = (enum.auto(), "消息7")
    MSG_ID_10 = (10, "消息10")
    MSG_ID_11 = (enum.auto(), "消息11")

    def __new__(cls, value, string_value):
        member = object.__new__(cls)
        member._value_ = value
        member.string_value = string_value
        return member
        
"""

class OStringStream():
    def __init__(self):
        self._buff=""
        self._len = 0
    
    @property
    def buff(self):
        return self._buff
        
    @property
    def len(self):
        return self._len
    
    def append(self, data):
        self._buff += data
        self._len += len(data)
        
class Visitor(ast.NodeVisitor):
    def __init__(self, file):
        self._file = file
        self._indent = 4
        self._data = OStringStream()
        self._data.append("""#ifndef MSG_ID_H
#define MSG_ID_H
""")
    def entry_indent(self, space=1):
        self._indent += space
        self._data.append(Visitor.backspace(self._indent))
        
    def exit_indent(self, space=1):
        self._indent -= space
        
    @staticmethod
    def backspace(num=1):
        return " "*num
    
    def line(self):
        self._data.append("\n")
    
    def visit(self, node):
        method = 'visit_' + node.__class__.__name__
        visitor = getattr(self, method, self.generic_visit)
        return visitor(node)
    
    def visit_FunctionDef(self, node: FunctionDef) -> Any:
        return True
    
    def visit_Assign(self, node: Assign) -> Any:
        is_auto_func = False
        msg_id_name = node.targets[0].id
        msg_id_value, doc = node.value.elts
        if isinstance(msg_id_value, ast.Call) and isinstance(msg_id_value.func, ast.Attribute) and msg_id_value.func.attr == 'auto':
            is_auto_func=True
        self.entry_indent(4)
        
        msg_id_value = "," if is_auto_func else f"={msg_id_value.value},"
        self._data.append(f"{msg_id_name}{msg_id_value:>10}{self.backspace(8)}//{self.backspace(4)}{doc.value}")
        self.line()
        self.exit_indent(4)
        return True
    
    def visit_Import(self, node: Import) -> Any:
        self._data.append(f"#include <stdio.h>")
        self.line()
        return True
    
    def visit_ClassDef(self, node: ClassDef) -> Any:
        if not node.name:
            print(f"Error:expect class name")
            return False
        self._data.append("enum %s%s" %(node.name, Visitor.backspace()))
        self.line()
        self._data.append("{")
        self.line()
        
        for stmt in node.body:
            res = self.visit(stmt)
            if not res:
                print(f"Error: stmt error")
                return False
        self._data.append("};")
        self.line()
        return True
    
    def generic_visit(self, node):
        return True
    
    def write_file(self):
        with open(self._file, "w") as f:
            f.write(self._data.buff)


if __name__ == "__main__":
    out = ast.parse(str)
    print(ast.dump(out, indent=4))
    for stmt in out.body:
        print(stmt)
        vs = Visitor("msg_id.h")
        vs.visit(stmt)
        vs._data.append("#endif")
        vs.write_file()




文章来源地址https://www.toymoban.com/news/detail-824933.html

到了这里,关于python ast 解析enum为C头文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ast在python架构中的使用

    AST学习 AST简介: AST(Abstract syntac tree)是编译原理中的概念,是对源代码语法结构的一种抽象表示,它以树的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。 下面的代码展示了以demo.py中的ast语法,对source_code.py中的内容进行修改,并将修改后的内容

    2024年02月11日
    浏览(30)
  • 【python模块】python解析json文件详解

    JSON(Java Script Object Notation)是一种通常用于以不会“对系统造成负担”的方式传输数据(主要通过 API)的格式。基本原理是利用文本来记录数据点,并将数据点传输给第三方。 JSON是一种使用文本存储数据对象的格式。换句话说,它是一种数据结构,将对象用 文本形式 表示出

    2024年02月08日
    浏览(42)
  • 深入解析Python文件操作:打开文件处理的大门

    在Python中,文件操作是一项常见且重要的任务。通过文件操作,我们可以读取文件内容、写入新的数据以及对文件进行其他的操作。本文将介绍Python中的文件操作,包括打开文件、读取文件、写入文件和关闭文件等基本操作,以及一些常用的文件处理技巧和最佳实践。 在进行

    2024年02月16日
    浏览(42)
  • python:configparser --- 配置文件解析器

    此模块提供了它实现一种基本配置语言 ConfigParser 类,这种语言所提供的结构与 Microsoft Windows INI 文件的类似。 你可以使用这种语言来编写能够由最终用户来自定义的 Python 程序。 备注 这个库 并不 能够解析或写入在 Windows Registry 扩展版本 INI 语法中所使用的值-类型前缀。 让

    2024年02月05日
    浏览(43)
  • python 数据分析之 HTML文件解析

    HTML 是用来描述网页的一种语言。HTML 是一种在 Web 上使用的通用标记语言。HTML 允许你格式化文本,添加图片,创建链接、输入表单、框架和表格等等,并可将之存为文本文件,浏览器即可读取和显示。 HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言,

    2024年02月16日
    浏览(46)
  • Python解析CANoe录制的blf文件&asc文件通用方法

    一、背景     由于很多时候我们在录制日志文件的时候更愿意选择BLF文件,至少目前我见到的很多公司都是使用的BLF文件来作为最后的日志文件,相比较ASC文件,BLF文件属于二进制文件,所以没有办法通过文本编辑器直接读写,所以本文章介绍了如何解析blf文件的方法,

    2024年02月12日
    浏览(31)
  • Python读取二进制文件:深入解析与技术实现

    目录 一、引言 二、二进制文件的基础 1、二进制文件的组成 2、二进制文件的编码 三、Python读取二进制文件的方法 1、使用内置函数open() 2、使用numpy库 四、处理读取的二进制数据 1、解析数据 2. 转换数据类型 五、总结与展望 1、高效读取二进制文件 2、处理复杂的二进制文件

    2024年02月04日
    浏览(40)
  • Python中对open读取文件内容时的mode模式解析

    Python3中的open函数定义为: 其中mode列表为: 这里我们主要关心一下\\\'r\\\', \\\'w\\\', \\\'a\\\', \\\'r+\\\', \\\'w+\\\', \\\'a+\\\', \\\'x\\\',很多人容易混淆不同模式的读写操作 2.\\\'r\\\' 只读模式,open函数中mode参数的默认模式,文件不存在的话,报FileNotFoundError(python2是IOError); 文件打开后,初始游标位置为0; 每次读都

    2024年02月12日
    浏览(39)
  • python解析mdf或mf4文件利器---asammdf

    安装 解析 1.读取文件,获取信号 如果对mdf的格式不熟悉,可以百度下资料,本文主要介绍asammdf的使用。 2. 获取所有信号名及其索引 3. mdf转成dataframe 这个方法有个坑,canape采集数据允许不同信号不同频率,也就是说数据对不齐,这种情况下调这个方法会导致爆内存,所以使

    2024年02月08日
    浏览(30)
  • ANSYS二次开发:Python解析ansys fluent结果文件

    🍺相关文章汇总如下🍺: 🎈ANSYS二次开发:APDL开发入门准备🎈 🎈ANSYS二次开发:后处理使用APDL命令流解析结果文件🎈 🎈ANSYS二次开发:Python解析ANSYS结果文件(PyAnsys库)🎈 🎈ANSYS二次开发:Python和ANSYS进行交互操作(PyAnsys库,PyDPF)🎈 🎈ANSYS二次开发:Python解析ANS

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包