正在使用pycparser分析C中结构中的结构

Parsing struct within struct in C using pycparser?

本文关键字:结构 分析 pycparser      更新时间:2023-10-16

我有一个要解析的示例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:...pycparserc_parser.py", line 146, in parse
   debug=debug_level)
  File "D:...pycparseryacc.py", line 331, in parse
   return self.parseropt_notrack(input, lexer, debug, tracking, tokenfunc)
  File "D:...pycparseryacc.py", line 1181, in parseropt_notrack
   tok=call_errorfunc(self.errorfunc, errtoken, self)
  File "D:...pycparseryacc.py", line 193, in call_errorfunc
   r=errorfunc(token)
  File "D:...pycparserc_parser.py", line 1699, in p_error
   column=self.clex.find_tok_column(p)))
  File "D:...pycparserplyparser.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说应该使用Clang来解析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;

应该正确编译。