想对 C 语言的源代码做变换,变换逻辑不太复杂,用 C++/LLVM 实现不合算,尝试一下 antlr4 + python。

访问 ANTLR 官网
下载 antlr 语法文件 .g4 的编译器等工具
pip install antlr4-tools

安装 Java 11 和 ANTLR jar
antlr4

antlr4

虽然 C 源代码结构清晰,但操作系统将其保存为字符串(文件),进入程序的处理流程时也是作为字符串类型的变量。另一方面,拿 C 语言来说,方便程序处理的 “结构体” 数据结构在内存中的格式是 “含有指针的若干记录” 的结构体格式,与字符串有差异。把源代码从字符串格式变换成结构体格式的程序叫语法分析器(parser)。

antlr4 可以根据语法生成识别该语法的 parser,以 Java,Python 或 C++ 等语言的源码形式给出的。不同语法的 parser 存在公共的部分,这部分作项目依赖的 runtime。对于某个语法(用 .g4 文件描述), parser 中特殊的部分合入项目的源码。

源码经 parser 解析后变为语法树,

python

安装 Python runtime
pip install antlr4-python3-runtime

准备好 github 上的 C 语法描述文件,生成 Parser 和 Visitor 如下
antlr4 -Dlanguage=Python3 -visitor -no-listener C.g4

生成如下文件:
C.g4 C.interp CLexer.interp CLexer.py CLexer.tokens CParser.py C.tokens CVisitor.py

API

在 python 中使用 parser 的代码:

import sys
from antlr4 import *
from CLexer import CLexer
from CParser import CParser
from CVisitor import CVisitorclass FuseRewriter(CVisitor):def visitTerminal(self, node):if node.symbol.type == Token.EOF:return self.defaultResult()else:return [node.getText()]def visitErrorNode(self, node):print('parse error')assert Falsedef defaultResult(self):return []def aggregateResult(self, aggregate, nextResult):return aggregate + nextResultdef visitPostfixExpression(self, ctx: CParser.PostfixExpressionContext):return super().visitPostfixExpression(ctx)def main():if len(sys.argv) > 1:input_stream = FileStream(sys.argv[1])else:input_stream = InputStream(sys.stdin.read())lexer = CLexer(input_stream)stream = CommonTokenStream(lexer)parser = CParser(stream)tree = parser.compilationUnit()c_tree_str = tree.toStringTree(recog=parser)# print(c_tree_str)visitor = FuseRewriter()return visitor.visit(tree)if __name__ == '__main__':tokens = main()print(' '.join(tokens))

visitor

antlr4 根据语法描述文件(.g4)生成语法分析器,该分析器可以根据源文件构建语法树(parse tree)。语法树是一种树形数据结构,其根节点代表整个源文件,叶子节点(称为 TerminalNode,终结符节点)代表不可再分的词法单元(如一个整数常量),其余的位于树中间部分的节点代表语法规则节点(RuleNode)。如果源文件中存在语法错误,则其对应的语法树中还会出现错误节点(ErrorNode)。

操作树形数据结构的算法,可以采用观察者设计模式(Listener)或访问者设计模式(Visitor),antlr4 runtime 通过提供观察者和访问者的基类(Base class),支持了上述两种设计模式。

antlr + python相关推荐

  1. python antlr_使用ANTLR在5分钟内用Java解析任何语言:例如Python

    python antlr 我喜欢出于多种目的处理代码,例如静态分析或自动重构. 对我来说,有趣的部分是推理从抽象语法树(AST)构建的模型. 为此,您需要一种从源文件中获取AST的方法. 可以使用AN ...

  2. 使用ANTLR在5分钟内用Java解析任何语言:例如Python

    我喜欢出于多种目的处理代码,例如静态分析或自动重构. 对我来说,有趣的部分是推理从抽象语法树(AST)构建的模型. 为此,您需要一种从源文件中获取AST的方法. 使用ANTLR和完整的语法集合可在此处 ...

  3. 使用ANTLR做一个简单的Python SQL语法解析器 - 推酷

    使用ANTLR做一个简单的Python SQL语法解析器 - 推酷 使用ANTLR做一个简单的Python SQL语法解析器 - 推酷 posted on 2016-11-14 13:11 lexus ...

  4. 《ANTLR 4权威指南》——2.1节从ANTLR元语言开始

    本节书摘来自华章社区<ANTLR 4权威指南>一书中的第2章,第2.1节从ANTLR元语言开始,作者[美] 特恩斯·帕尔(Terence Parr),更多章节内容可以访问云栖社区" ...

  5. csv java web 导入_DAY5-step9 使用CSV模块和Pandas在Python中读取和写入CSV文件

    什么是CSV文件? CSV文件是一种纯文本文件,其使用特定的结构来排列表格数据. CSV是一种紧凑,简单且通用的数据交换通用格式. 许多在线服务允许其用户将网站中的表格数据导出到CSV文件中. CSV ...

  6. antlr 4.7.1_新ANTLR 4.6的重要更改

    antlr 4.7.1 自上一个主要版本发布以来,已经过去了将近一年的时间,推出了新的ANTLR版本: 4.6 . 有很多新闻:新的目标,更好的性能,更好的错误处理以及ANTLR本身开发中的一些改进. ...

  7. antlr 语言 库_关于ANTLR的通用库的需求:使用反射来构建元模型

    antlr 语言 库 我是一名语言工程师:我使用多种工具来定义和处理语言. 在其他工具中,我使用ANTLR:它简单,灵活,可以围绕它进行构建. 但是我发现自己围绕ANTLR为不同的项目重建了类似的工具 ...

  8. 新ANTLR 4.6的重要更改

    自从上一个主要版本发布以来,已经过去了将近一年的时间,推出了新的ANTLR版本: 4.6 . 有很多新闻:新的目标,更好的性能,更好的错误处理以及ANTLR本身开发中的一些改进. 新目标 影响最大的新 ...

  9. 关于ANTLR的通用库的需求:使用反射来构建元模型

    我是一名语言工程师:我使用多种工具来定义和处理语言. 在其他工具中,我使用ANTLR:它简单,灵活,可以围绕它进行构建. 但是,我发现自己围绕ANTLR为不同的项目重建了类似的工具. 我看到两个问题: ...

最新文章

  1. AWS 发布了新的负载均衡器 ALB
  2. 《Adobe Photoshop CS5中文版经典教程(全彩版)》—第2课2.8节使用仿制图章工具修复特定区域...
  3. Oracle 9i 数据库 创建数据库 Net 配置 创建表 SQL查询 创建存储过程 (图)
  4. DL之CNN:自定义SimpleConvNet【3层,im2col优化】利用mnist数据集实现手写数字识别多分类训练来评估模型
  5. 无影云电脑居家办公最佳实践(AD域账号)
  6. SAP Spartacus Cost Center list的实现原理
  7. 数学--数论--因子和线性筛 (模板)
  8. Oracle高可用概述(HA与RAC的关系解惑)
  9. php判断数组中的键是否是某个字符串,php判断数组中是否存在指定键(key)的方法...
  10. jQuery数据存储的相关方法
  11. WPF中实现PropertyGrid的三种方式
  12. DB9接口详解---DB9引脚在 UART,CAN,RS485中的定义
  13. 链路聚合的配置(思科)
  14. PS套索工具抠图及快捷键
  15. python爬取网易云课堂python课程
  16. Python学习心得体会
  17. 【LeetCode】第934题——最短的桥(难度:中等)
  18. 微信小程序如何封装api接口
  19. 大商创 常见问题 mysql_大商创手机端出现404的官方解决方案
  20. 关于AML芯片电视,风行刷机包的自定义和去广告的研究

热门文章

  1. 数据仓库简介、数据仓库的发展、数仓理论简介
  2. Keras Tuner模型自动超参数调优
  3. 统计学 分布篇 - Poisson Distribution(泊松分布)
  4. wasc honeypot
  5. Ghost超级技巧一家亲
  6. mysql数据迁移与同步常用解决方案总结
  7. 计算机会计二级科目,(完整版)会计科目一览表(一级科目二级科目三级科目)..pdf...
  8. 使用PYTHON图像识别实现车牌号码识别
  9. 在哪下载Mysql数据库的JDBC驱动jar包
  10. 前端、后台、客户端以及服务器