使用pycparser在C中解析struct中的struct?

时间:2016-07-25 05:26:17

标签: python c++ c parsing clang

我有一个我要解析的示例c文件:

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中处理struct? 我认为这是一些基本要求,所以我很确定我的配置中存在的问题...

还有一件事:我知道pcypareser的作者@ Eli Bendersky表示应该use Clang to parse C++,但我想知道是否还有其他人现在选项解析C ++(最好是通过Python),并且用户友好。

感谢。

1 个答案:

答案 0 :(得分: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;

应该正确编译。