免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2502 | 回复: 5
打印 上一主题 下一主题

[文本处理] 正则表达式查询c++源码中的函数定义 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-06 23:40 |只看该作者 |倒序浏览
本帖最后由 jack9981 于 2014-07-07 10:47 编辑

有相应的正则表达式吗? 可以假定源码中没有注释,没有字符串。

define sum( x, y )   {x+y}                                                
namespace x {                                                              
class a  {                                                                 
    a( )  { }                                                              
    ~a(  ){ if (  0 );}                                                   
    fun1(int x) const { return p(x); }                                    
    fun2(int xx) : x(xx) {}                                                
    fun3(int xx, int yy) : x(xx),y(yy) {}                                 
}                                                                          
                                                                           
template<typename T>                                                      
inline static void a::f(T s)                                               
{                                                                          
}                                                                          
                                                                           
template<class T>  void g(T, T = T()){}                                    
                                                                           
int f:perator+() { ... }                                                
int f:perator==() { ... }                                                
int f:perator@() {                                                      
for (int i = begin; i < end; i++) { }                                    
if (i != vector) {}                                                   
}      





----------------

function list:                                                            
a()                                                                        
~a()                                                                       
fun1(int x) const                                                         
fun2(int xx) : x(xx)                                                      
fun3(int xx, int yy) : x(xx),y(yy)                                         
inline static void a::f(T s)                                               
void g(T, T = T())                                                         
int f:perator+()                                                         
int f:perator==()                                                        
int f:perator@()      


论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2014-07-07 08:59 |只看该作者
给出文本,给出期望结果~

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-08 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-09-18 06:20:00数据库技术版块每周发帖之星
日期:2015-11-06 19:56:51数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00数据库技术版块每日发帖之星
日期:2016-02-05 06:20:00
3 [报告]
发表于 2014-07-07 09:16 |只看该作者
  1. grep "^funcname" * -r --color
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
4 [报告]
发表于 2014-07-07 10:15 |只看该作者
回复 1# jack9981

无例子,无代码。
   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
5 [报告]
发表于 2014-07-07 13:38 |只看该作者
本帖最后由 Herowinter 于 2014-07-07 13:44 编辑

回复 1# jack9981
目测接近不可能,没语法树,纯文本分析怎么判断
define sum( x, y )
if(xxx)
不是一个函数定义而
int sum(int x,int y)是一个函数定义?

等等,这语法不对啊,楼主随便写段代码糊弄我们?
#define吧?

   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2014-07-07 14:48 |只看该作者
回复 1# jack9981
对于你提供的这个文件,可以这样。
  1. awk 'BEGIN{keywords["define"];keywords["if"];keywords["for"]} !($1 in keywords)&&/.*\([^)]*\)/{sub(/^[[:space:]]*(.*>[[:space:]]*)?/,"");sub(/[[:space:]]*{.*/,"");print}' i
  2. a( )
  3. ~a(  )
  4. fun1(int x) const
  5. fun2(int xx) : x(xx)
  6. fun3(int xx, int yy) : x(xx),y(yy)
  7. inline static void a::f(T s)                                               
  8. void g(T, T = T())
  9. int f::perator+()
  10. int f::perator==()
  11. int f::perator@()
复制代码
  1. cat i
  2. define sum( x, y )   {x+y}                                                
  3. namespace x {                                                              
  4. class a  {                                                                 
  5.     a( )  { }                                                              
  6.     ~a(  ){ if (  0 );}                                                   
  7.     fun1(int x) const { return p(x); }                                    
  8.     fun2(int xx) : x(xx) {}                                                
  9.     fun3(int xx, int yy) : x(xx),y(yy) {}                                 
  10. }                                                                          
  11.                                                                            
  12. template<typename T>                                                      
  13. inline static void a::f(T s)                                               
  14. {                                                                          
  15. }                                                                          
  16.                                                                            
  17. template<class T>  void g(T, T = T()){}                                    
  18.                                                                            
  19. int f::perator+() { ... }                                                
  20. int f::perator==() { ... }                                                
  21. int f::perator@() {                                                      
  22. for (int i = begin; i < end; i++) { }                                    
  23. if (i != vector) {}                                                   
  24. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP