【问题标题】:Pythonic way to remove a function's contents删除函数内容的 Pythonic 方法
【发布时间】:2015-02-24 11:03:36
【问题描述】:

我想解析一个目录树,找到每个*.cpp,然后剔除函数,给我留下模拟。

解析树没问题。取出内脏比较困难。

我目前正在将源文件读入一个字符串并逐个字符地循环它。如果我看到一个封闭的圆括号 ) 并且下一个非空白字符是一个左括号 { 那么我有一个函数 start。

然后我可以停止写入输出,同时计算左大括号和右大括号,直到在函数末尾找到匹配的大括号 }

代码很糟糕,有漏洞,并且不断变化,因此几乎不值得发布。

是否有一个优雅的解决方案,可能涉及正则表达式,它将删除文件中所有函数的主体,保持其余部分不变?

如果它可以检测到函数的类型并生成一个返回语句,那么我可以自己解决这个问题。

【问题讨论】:

  • “剔除功能”,多么好的程序!
  • 正则表达式在嵌套块中很糟糕,例如 {}()。相关问题:stackoverflow.com/questions/1444961/…
  • C++ 不是常规语言,而是上下文无关语言。你需要一个合适的解析器,正则表达式会让你的麻烦更大。
  • 如果您使用处理递归的新正则表达式模块,这是可能的(并且使用精心设计的模式很快)。但是你不能用 re 模块做到这一点。您是否搜索过 C++ 解析器模块是否已经存在,或者您是否尝试过词法分析器模块?但是,改进您已经编写的代码可能是一种方式。
  • @Lucho:很容易避免这种情况,以避免将某些内容包含在字符串中。您只需要在之前匹配它们即可。

标签: python regex python-3.x mocking


【解决方案1】:

您可以使用解析器,clang api 提供它并且您有 python 绑定:https://github.com/llvm-mirror/clang/tree/master/bindings/python

这篇文章可以给你一些关于如何使用它的见解:http://szelei.me/code-generator/

还有一些包装器可以让您的工作更轻松,例如:https://github.com/sztomi/cmonster

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2017-12-17
    相关资源
    最近更新 更多