2012-04-02 61 views
2

我想分析的头文件,以获取所有恒宏象:解析C头文件,以确定所有的宏定义

#define ARRSIZE 10 
#define WORDSIZE 32 
#define TOTALSIZE (ARRSIZE * WORDSIZE) 

,并创建一个列表和数组,如:

# define XARRSIZE 0 
# define XWORDSIZE 1 
# define XTOTALSIZE 2 

int table[] = {ARRSIZE, WORDSIZE, TOTALSIZE} 
// Now, table[XWORDSIZE] will fetch value of WORDSIZE. 

所以,我想忽略以下内容:

  1. 所有评论。
  2. 结构(C struct)声明。
  3. extern函数声明。
  4. typedef s。

一种方法可以使用lex和yacc编写解析器。但是,这个任务似乎更简单。有没有办法使用'cpp'等工具遍历头文件中的所有常量宏?

请提出任何更好的方法。

+0

宏总是与'#定义MACRONAME'开始。这听起来不像分析会很困难(只要你不关心'#ifdef'内的东西等等)。 – 2012-04-02 10:48:56

+1

@OliCharlesworth不要忘记多行宏。 – 2012-04-02 10:49:55

+0

你可以在[lex](http://en.wikipedia.org/wiki/Lex_%28software%29)和[yacc](http://en.wikipedia.org/wiki/Yacc)中实现它)解析器。 – 2012-04-02 10:50:03

回答

2

如果你真的只是想宏的列表:

awk '/#define/{ print $2 }' <source.h 
+2

这不符合“忽略所有评论”的要求。 – 2012-04-02 11:37:30

+1

'#'和'define'之间可以有空格。我无法记住我的头顶是否在行首和'#'之间可能有空格。另外,我非常确定C中可能存在多行宏。 – hippietrail 2012-04-02 12:08:35

+0

不忽略恰好包含看起来像预处理指令的字符串文字。要做到这一点,你需要一个完整的词法分析器。 – 2015-03-19 06:03:24