gpt4 book ai didi

java - 如何使用 Javaparser 解析 for 循环?

转载 作者:行者123 更新时间:2023-12-02 02:24:13 24 4
gpt4 key购买 nike

我需要使用javaparserfor-loop的不正确形式解析为正确的形式。我的循环有 5 个参数:

  1. 循环索引 (i);
  2. 索引的初始值。可以是其他值(例如k)或int值(10);
  3. 循环不变式的值 (3);
  4. 不变量的条件(>、<、>= 或 <=);
  5. 操作,在每次循环运行后执行(- 或 + 将更改为 i-- 或 i++)。

enter image description here

我创建了两个类。第一个是不正确的循环,第二个是正确的循环(解析后)。我首先决定编写这两个类来检查解析前后的代码应该如何查看,然后编写解析代码。但我不确定这是一个好的开始,我代表了我的 for 循环正确性。说明一下:我想将 Class.java 中的代码解析为 ClassAltered.java。

第一个循环不正确的类:

public class Class {
public static void main(String[] args) {
test1();
test2();
}

public static void test1() {
FOR(i, 10, 3, >, -);
System.out.println("FOR(i, 10, 3, >, -) test passed");
}

public static void test2() {
FOR(j, 0, 10, <=, +);
System.out.println("FOR(j, 0, 10, <=, +) test passed");
}
}

具有正确循环的第二个类:

public class ClassAltered {
public static void main(String[] args) {
test1();
test2();
}

public static void test1() {
for(int i=10; i > 3; i--);
System.out.println("FOR(i, 10, 3, >, -) test passed");
}

public static void test2() {
for(int j=0; j<= 10; j++);
System.out.println("FOR(j, 0, 10, <=, +) test passed");
}
}

最佳答案

这是可能的,但远高于平均任务。

您无法使用“普通”javaparser 执行此操作,因为 javaparser 解析 Java 语法并 FOR(i, 10, 3, >, -); 不是 Java 语法。所以“普通”javaparser 将无法解析它。

您需要做的是创建您自己的 javaparser 分支/版本,并修改 java.jj 语法以包含您的“不正确的 for”语句。检查this fragment正常的 ForStatement 是什么样子的:

Statement ForStatement():
{
VariableDeclarationExpr varExpr = null;
Expression expr = null;
NodeList<Expression> init = emptyList();
NodeList<Expression> update = emptyList();
Statement body;
JavaToken begin;
}
{
"for" {begin=token();} "("

(
LOOKAHEAD(VariableDeclarationExpression() ":")
varExpr = VariableDeclarationExpression() ":" expr = Expression()
|
[ init = ForInit() ] ";" [ expr = Expression() ] ";" [ update = ForUpdate() ]
)

")" body = Statement()

{
if (varExpr != null) {
return new ForeachStmt(range(begin, token()),varExpr, expr, body);
}
return new ForStmt(range(begin, token()),init, expr, update, body);
}
}

这并不太难,你可能会通过类比来做到这一点,你不需要太多的 JavaCC 知识。

接下来,当语法完成后,您将获得一个 javaparser ,它将能够解析“不正确的”for 循环。结果将是一个包含类似 In CorrectForStmt 的 AST(您需要实现此类)。

在测试中,您需要解析源代码,然后分析生成的 AST 以找到 In CorrectForStmt。要进行验证,您需要检查 In CorrectForStmt 的子节点。

关于java - 如何使用 Javaparser 解析 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48034411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com