使用JavaParser解析Java代码并查找父节点的语句类型
我制作了一个小程序,它使用JavaParser[1]解析Java代码并识别代码中出现的语句类型。这已成功实施。接下来我要做的是(有点棘手)找到if-statement
的父节点,并检查父节点的第一条语句是否为while-loop
。在确认上述语句为true之后,我还想确定这个if-statement
是否是父节点的最后一个子节点
以下是上述描述的一个示例:
void example() {
int x = 1;
int y = 1;
while (y < 3) {
while (x < 4) {
x++;
}
if (y < 5) {
y++;
}
}
x = 0;
}
我在解析上述代码时遇到的主要问题是,如何获得if (y < 5 )
的父节点是一个while-loop
(while (y < 3)
),其次,可能更棘手的是,如何确定这个示例的if-statement
是我们跳回到父节点loop
之前的最后一个语句。^ {< CD10> }中也有^ {CD9}},但是如果{{CD10}}的条件不正确,则可能跳过,所以我不想把它看作父节点的最后一个子节点。我认为我应该做的是检查最后一个“邻居”?我所说的邻居是指本例中第二个while
和if
之间的关系,即它们处于同一级别
到目前为止,我的想法得到了落实:
//find if the if-statement has a parent node
if (currIf.getParentNode().isPresent()) {
//find if the parent Node is a While loop
Optional<Node> parent = currIf.getParentNode();
parent.get().getBegin();
}
通过上面的代码,我可以检查if-statement
是否有父节点,并且我可以找到第一个while
的位置,但是我不知道如何确认它是一个while statement
并实现第二个描述的部分
更新:
我设法找到了如何检查父级是否为while-loop
的方法,目前正在尝试找到一个解决方案,以确定if-statement
是其级别(或层次结构,如果您愿意)的最后一个statement
Optional<WhileStmt> ifParent = currIf.findAncestor(WhileStmt.class);
//find if the if-statement has a parent node
if (ifParent.isPresent()) {
//find if the parent Node is a While loop
Optional<Node> sameNode = ifParent.get().findFirst(Node.class, n -> n == currIf);
if (sameNode.isPresent()) {
System.out.println(sameNode);
}
}
# 1 楼答案
如果我理解正确,你的更新可能会给你错误的结果。是的,如果
WhileStmt
是父级,那么您的解决方案会起作用,但它也可以让您的WhileStmt
位于树的更高位置你为什么不能做下面这样的事情
要确定
ifStmt
是否是最后一个节点,可以执行以下操作: