[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没有。
我正在使用 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没有。