[Clang RecursiveASTVisitor]如何区分'If'语句和'Else If'语句?

[Clang RecursiveASTVisitor]How to make a distinction between 'If' statement and 'Else If' statement?

我正在使用 clang 的 RecursiveASTVisitor 来解析一些 C 代码。我重写了 visitStmt() 并想区分 'If' 语句和 'Else If' 语句。

示例:

    if(a > 0){
      XXX
    }
    else if(a == 0){
      YYY
    }
    else{
      ZZZ
    }

在visitStmt()中,我使用:

    if(isa<IfStmt>(S))

判断一条语句是否为IfStmt。

但是我怎么知道语句是'Else If'而不是'If'呢?

我想插入不同的存根('If' 下的 XXX 和 'Else If' 下的 YYY)。

ps:我的母语不是英语。请原谅我的拙劣表达

在 C 中没有特定的 else if 语句,因为

if (a) {
  ...
} 
else if (b) {
  ...
} 
else {
  ...
}

在概念上(并且在 AST 方面)类似于以下内容

if (a) {
  ...
} 
else { 
  if (b) {
    ...
  } 
  else {
    ...
  }
}

所以第一个片段有点像“隐藏嵌套”,因为第一个 else 的主体仅包含一个 if ... else 语句,因此您可以省略 {} 周围。最后一个 else 不属于第一个 if 而属于第二个

所以你可能可以做的来确定你是否有一个 else if 或没有,在树中向上走,并检查当前节点的父节点是否是一个 else 语句并且 if 是该 parent-else 主体中的 first(或唯一)语句。

还有其他语言(例如 VB)具有 If .. ElseIf .. Else 结构。但是C没有。