使用pycparser解析struct C中的struct?
问题描述:
我有这个例子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),并且用户友好。
感谢。
答
你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妥善保存。
分号在这里是一个错字。并存在于原始代码中。 +1与C到C++之间的区别,我想这就是为什么我问及解析C++的原因......我正在使用C++,但不知道在将结构声明为类型的方式上存在实际差异名称... –
@BakItzik在C中,结构类型是一个单独的标识符空间,所以您必须在引用某个类型时显式声明状态。然而,在C++中,'struct'相当于一个'class',只是默认的初始继承类型'private'替换为'public'。因此,在C++中用'struct'关键字声明的类型成为全局可用的类型名称,与声明为'class'的类型相同。 – CiaPan