2016-07-25 232 views
2

我有这个例子C文件我想分析:使用pycparser解析struct C中的struct?

StrcutWithinStruct.c 
// simple struct within a struct example 

struct A { 
int a; 
}; 

struct B { 
A a; 
int b; 
}; 

我跑pcyparser解析它,用下面的代码

exploreStruct.py 
#parse StructWithinStruct 

from pycparser import parse_file 
ast = parse_file(filename='..\StructWithinStruct.c') 
ast.show() 

其结果是,我得到了以下内容:

Tracback (most recent call last): 
    File "exploreStruct.py", line 3, in <module> 
    ast = parse_file(filename='...\StructWithinStruct.c') 
    File "D:\...\pycparser\__init__.py", line 93, in parse_file 
    return parser.parse(text,filename) 
    File "D:\...\pycparser\c_parser.py", line 146, in parse 
    debug=debug_level) 
    File "D:\...\pycparser\yacc.py", line 331, in parse 
    return self.parseropt_notrack(input, lexer, debug, tracking, tokenfunc) 
    File "D:\...\pycparser\yacc.py", line 1181, in parseropt_notrack 
    tok=call_errorfunc(self.errorfunc, errtoken, self) 
    File "D:\...\pycparser\yacc.py", line 193, in call_errorfunc 
    r=errorfunc(token) 
    File "D:\...\pycparser\c_parser.py", line 1699, in p_error 
    column=self.clex.find_tok_column(p))) 
    File "D:\...\pycparser\plyparser.py", line 55, in _parse_error 
    raise ParseError("%s: %s % (coord, msg)) 
pycparser.plyparser.ParserError: D:...\StructWithinStruct.c:7:2: Before A 

那么,pycparser是否可以处理结构体内的struct,或者不是? 我认为这是一些基本的要求,所以我敢肯定,趴在我的配置某处的问题...

一两件事:我知道pcypareser作者,@Eli Bendersky,说一个人应该use Clang to parse C++ ,但我想知道现在是否有另一种选择来解析C++(最好是通过Python),并且用户友好。

感谢。

回答

4

struct声明没有关闭分号:

此外A本身不是C中的类型名称在C++ A仅此一项就足够了,但在C你需要添加struct关键字。

struct A { 
int a; 
}; 

struct B { 
struct A a; 
int b; 
}; 

或者,你可以声明的代名词了typedef关键字:

struct A { 
int a; 
}; 

typedef struct A A; 

,或者更短:

typedef struct A { 
int a; 
} A; 

从这一点声明

A a; 

应C妥善保存。

+0

分号在这里是一个错字。并存在于原始代码中。 +1与C到C++之间的区别,我想这就是为什么我问及解析C++的原因......我正在使用C++,但不知道在将结构声明为类型的方式上存在实际差异名称... –

+2

@BakItzik在C中,结构类型是一个单独的标识符空间,所以您必须在引用某个类型时显式声明状态。然而,在C++中,'struct'相当于一个'class',只是默认的初始继承类型'private'替换为'public'。因此,在C++中用'struct'关键字声明的类型成为全局可用的类型名称,与声明为'class'的类型相同。 – CiaPan