【问题标题】:Parsing struct within struct in C using pycparser?使用pycparser解析C中结构内的结构?
【发布时间】:2016-07-25 05:26:17
【问题描述】:

我有这个示例 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),并且是用户友好的。

谢谢。

【问题讨论】:

    标签: python c++ c parsing clang


    【解决方案1】:

    您的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;
    

    应该可以正确编译。

    【讨论】:

    • 这里的分号是错字。并存在于原始代码中。 +1 关于 C 与 C++ 之间的区别,我想这就是为什么我也询问解析 C++ 的原因......我正在使用 C++,但不知道你将结构声明为类型的方式有实际差异名字...
    • @BakItzik 在 C 中,结构类型是一个单独的标识符空间,因此在引用类型时必须明确声明 is。然而,在 C++ 中,struct 等价于 class,只是将默认初始继承类型 private 替换为 public。因此,在 C++ 中使用 struct 关键字声明的类型成为全局可用的类型名称,其方式与声明为 class 的类型相同。
    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2019-01-08
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多