【发布时间】:2020-03-11 16:20:25
【问题描述】:
在大型 C 项目中,有许多 structs 具有其他 structs 或指向它们的指针作为字段。我想创建一个有向图来显示“类型”之间的依赖关系。一个例子是
typedef struct javaStat {
int idNo;
struct idIdentList *className;
struct typeModifiers *thisType;
struct symbol thisClass;
} ...
由此我想生成一个 DOT 结构,看起来像
digraph {
javaStat -> idIdentList
javaStat -> typeModifiers
javaStat -> symbol
}
或者,使用 DOT 简写:
digraph {
javaStat -> {idIdentList typeModifiers symbol}
}
当然第一行和最后一行可以手动添加,所以主要问题是将结构引用转换为图形“指针”行。
在这一点上,我对一级解决方案感到满意,这意味着可以忽略更深的嵌套。
我首先尝试了一个简单的grep struct *.h,它产生了一些可行的东西:
typedef struct javaStat {
struct idIdentList *className;
struct typeModifiers *thisType;
struct symbol thisClass;
typedef struct <next struct> {
这是一个简单的问题,几行 Python 就可以解决,但是否还有其他方便的解决方案,可能使用 sed、grep、awk 和他们的兄弟?
编辑:我意识到我想这样做的原因是因为我需要找到一个或多个位于“结构树”基础的结构。
【问题讨论】:
-
这将无法注意到类型为别名 (
typedef) 的结构成员。 -
@rici 是的,但我现在不在乎。但是对于工业强度的解决方案,您可能应该去实际解析事物,例如
pycparser. -
正是我的意思,虽然我倾向于clang python binding,因为从头开始构建一个 C 解析器似乎需要做很多工作。您需要问的问题包括(1)您最终是否需要更精确的信息,以及(2)您应该在非正式解决方案上投入多少精力,而不是在学习如何使用真正的 C 解析库方面投入多少精力。但我想你知道这一点。
-
我真的怀疑任何涉及 sed、grep 或 awk 的解决方案都可以定义为“方便”。它可能与“方便”完全相反。
-
@rici pycparser is 已经是具有节点访问者的 Python 中的完整 C 解析器。没试过clangs,但
pycparser帮了我几次。