【问题标题】:Need a tool to detect the type of variables in C code需要一个工具来检测 C 代码中的变量类型
【发布时间】:2012-12-30 08:12:34
【问题描述】:

我正在一个项目中开发特定的源到源编译器。在这个阶段,我需要在 C 源代码中找到变量的类型。例如,如果代码是c[i]=j*f[k]+p;,我应该找到cijfkp 变量的类型(int*float,以及源中定义的任何其他类型)。有什么工具可以做到这一点吗?如果有多个工具,我更喜欢基于 python 的工具。

谢谢你。

【问题讨论】:

  • 你不会从这样的代码片段中获取类型。你会从各自的声明中得到它们。你的问题还不清楚。
  • 当然。完整的源代码中提供了相应的声明。请假设代码写得很好并且可以编译。所以我们在解析过程中拥有了所有对应的声明。

标签: python c compiler-construction


【解决方案1】:

您可以使用pycparser 编写自己的解析器,您可以找到更多示例here

from pycparser import c_parser
parser = c_parser.CParser()
text = 'int x; int y; float z;'
ast = parser.parse(text, filename='<none>')
ast.show()
FileAST: 
  Decl: x, [], [], []
    TypeDecl: x, []
      IdentifierType: ['int']
  Decl: y, [], [], []
    TypeDecl: y, []
      IdentifierType: ['int']
  Decl: z, [], [], []
    TypeDecl: z, []
      IdentifierType: ['float']

【讨论】:

  • 小巧方便的工具!但是,它看起来并不接受所有 C 语句。当text 是所有变量声明时,它工作正常。不幸的是,如果代码包含赋值语句,解析器就会卡住!我应该深入研究它以了解它是如何工作的。谢谢。
  • @ahmad 我认为它处理所有有效的 C 代码,查看示例,您只需要声明即可找出变量的类型。
  • 示例目录的信息量比看起来要多得多。我认为pycparser 可以满足我的需求。谢谢。
【解决方案2】:

您应该能够使用 llvm-tools 从源代码创建AST,然后分析 AST。除了你的任务是编写类似 llvm-tools 的东西 :)

这是一个如何使用 llvm-bindings for python 分析 c 文件的示例:

http://www.mdevan.org/llvm-py/examples.html

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 2017-11-20
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多