首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何预处理for解析器的C源代码

如何预处理for解析器的C源代码
EN

Stack Overflow用户
提问于 2015-11-17 12:05:45
回答 1查看 6K关注 0票数 3

我需要用C++解析我的C和pycparser解析器代码,但在此之前需要去掉预处理指令和注释。

你知道怎么做吗?我已经找到了CPP预处理程序,但我不知道是否可以这样使用它,而不需要“完全”预处理。

我也找到了一个工具单发f,它似乎完全符合我的要求,但只使用预处理条件(例如#ifdef)。

我不想自己编写这个工具,因为它将与一个相当大的项目一起使用,所以我想使用一些非常复杂的东西。

我的尝试:

我已经尝试找到一些地方,在这段代码中调用的函数test在哪里:

代码语言:javascript
运行
复制
#include <stdio.h>

// asdfdsa
/* sadfsd
 * 
 */

void test() {
    printf("asd");
}

int main() {

    test();

    test();

    return 0;
}

我用命令gcc -E -std=c99 test.c -o testP.c对这段代码进行了预处理,然后尝试用下面的Python代码查找函数调用:

代码语言:javascript
运行
复制
#-----------------------------------------------------------------
# pycparser: func_defs.py
#
# Using pycparser for printing out all the calls of some function
# in a C file.
#
# Copyright (C) 2008-2015, Eli Bendersky
# License: BSD
#-----------------------------------------------------------------
from __future__ import print_function
import sys

# This is not required if you've installed pycparser into
# your site-packages/ with setup.py
sys.path.extend(['.', '..'])

from pycparser import c_parser, c_ast, parse_file


# A visitor with some state information (the funcname it's
# looking for)
#
class FuncCallVisitor(c_ast.NodeVisitor):
    def __init__(self, funcname):
        self.funcname = funcname

    def visit_FuncCall(self, node):
        if node.name.name == self.funcname:
            print('%s called at %s' % (self.funcname, node.name.coord))


def show_func_calls(filename, funcname):
    ast = parse_file(filename, use_cpp=True)
    v = FuncCallVisitor(funcname)
    v.visit(ast)

if __name__ == "__main__":
    if len(sys.argv) > 2:
        filename = sys.argv[1]
        func = sys.argv[2]
    else:
        filename = 'test.c'
        func = 'test'

    show_func_calls(filename, func)

但是,我还是发现了这个错误:

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "func_calls.py", line 46, in <module>
    show_func_calls(filename, func)
  File "func_calls.py", line 33, in show_func_calls
    ast = parse_file(filename, use_cpp=True)
  File "/usr/local/lib/python2.7/dist-packages/pycparser/__init__.py", line 93, in parse_file
    return parser.parse(text, filename)
  File "/usr/local/lib/python2.7/dist-packages/pycparser/c_parser.py", line 146, in parse
    debug=debuglevel)
  File "/usr/local/lib/python2.7/dist-packages/pycparser/ply/yacc.py", line 265, in parse
    return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc)
  File "/usr/local/lib/python2.7/dist-packages/pycparser/ply/yacc.py", line 1047, in parseopt_notrack
    tok = self.errorfunc(errtoken)
  File "/usr/local/lib/python2.7/dist-packages/pycparser/c_parser.py", line 1691, in p_error
    column=self.clex.find_tok_column(p)))
  File "/usr/local/lib/python2.7/dist-packages/pycparser/plyparser.py", line 55, in _parse_error
    raise ParseError("%s: %s" % (coord, msg))
pycparser.plyparser.ParseError: /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdarg.h:40:27: before: __gnuc_va_list
EN

Stack Overflow用户

回答已采纳

发布于 2015-11-17 12:46:29

pycparser文档,特别是他说,您应该使用cppgcc -E来准备用于解析的源代码。因此,“完整”预处理不是cpp的问题,而是在代码上运行pycparser所需的特性。

如果简单地去掉代码中的所有预处理指令,解析就会因为未声明的类型(如int32_tsize_t)和缺少原型的库函数而失败。

编辑:pycparser只支持C99语法。如果gcc出于某种原因将您的代码用于C++,请按以下方式运行预处理器:

代码语言:javascript
运行
复制
gcc -E -std=c99

EDIT2:看起来,与编译器特定的符号相关的错误越来越多。尝试使用由“假”标头提供的pycparser

代码语言:javascript
运行
复制
gcc -E -std=c99 -I/path/to/pycparser/utils/fake_libc_include
票数 8
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33763611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档