用pycparser解析C语言踩坑记录

pycparser是python的一个用于解析C语言的第三方库,相比于LLVM、CDT等安装使用过程较为简洁,它的官方开源库为https://github.com/eliben/pycparser。以下步骤记录我的安装和初步使用过程

安装

没什么好说的,直接

pip install pycparser 

如果遇到下图错误,有可能是网络原因,可以尝试 -i 添加镜像再下载

pip install pycparser -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

下载成功

运行使用

1. 循环引用

在尝试运行官方样例c_to_c时首先遇到了这样的问题:

让人百思不得其解,还专门去安装查到的方法修改了__init__文件,以为是init文件里的函数导入需要特殊方法。后来仔细一看才发现,是因为我这个python文件命名的问题,ast和ast库重名了,导致循环引用。

于是修改文件名,此问题解决。

 

2. unable to invoke 'cpp'

运行样例c_to_c时又报错:

提示unable to invoke ‘cpp’,我顺腾摸瓜在__init__.py的preprocess_file函数中找到了这句提示的出处:

一开始我对这个parse_file函数的参数use_cpp的理解是标志使用C++而非C文件,而这里的check_output是查看路径中是否有这个文件的意思。后来发觉不对,一查资料发现check_output函数的作用是执行一条命令行指令。好家伙,那这里传入的可是cpp path/filename,原来意思是cpp是一条命令吗?后来经过阅读文档注释发现好像确实是这样,这条命令的作用是先对源文件进行预处理(C Pre Process),再拿去生成语法树。所以如果想简单使用、不想再安装这个工具的同学可选择直接将use_cpp置为False,就不会再出现这种错误了,就是注意待分析的文件里不要有#命令(头文件、宏定义、pragma)。

 

 

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
解析C语言的头文件,可以使用Python中的ply库。Ply是Python Lex-Yacc的缩写,是一个用于构建词法分析器和语法分析器的工具集。以下是一个示例代码,可以用于解析C语言的头文件: ```python from ply.lex import lex from ply.yacc import yacc # 定义词法分析器 tokens = ( 'NAME', 'TYPE', 'LPAREN', 'RPAREN', 'SEMICOLON', 'STAR', ) t_LPAREN = r'\(' t_RPAREN = r'\)' t_SEMICOLON = r';' t_STAR = r'\*' t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' def t_TYPE(t): r'int|float|double|char' return t t_ignore = ' \t\n' def t_error(t): print("Illegal character '%s'" % t.value[0]) t.lexer.skip(1) lexer = lex() # 定义语法分析器 def p_declaration(p): '''declaration : TYPE declarator SEMICOLON''' print(p[1], p[2]) def p_declarator(p): '''declarator : NAME''' p[0] = p[1] def p_declarator_pointer(p): '''declarator : STAR declarator''' p[0] = p[1] + p[2] def p_error(p): print("Syntax error in input!") parser = yacc() # 解析头文件 with open('example.h', 'r') as f: code = f.read() parser.parse(code) ``` 以上代码中,我们定义了词法分析器和语法分析器。词法分析器用于将C语言的头文件转换为标记流,语法分析器则用于将标记流转换为语法树。在这个示例中,我们只定义了一个简单的语法规则,用于解析变量声明。可以根据需要添加更多的规则。 需要注意的是,这个示例只能解析一些简单的头文件,如果头文件中包含复杂的语法结构,可能需要更复杂的规则和算法来解析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Absoler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值