0

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

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

在此处输入图像描述

我创建了两个类。第一个是不正确的循环,第二个是正确的循环(解析后)。我决定首先编写这两个类来检查解析前后的代码应该如何看待,然后编写解析代码。但我不确定这是一个好的开始,我代表了我的 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");
    }
 }
4

2 回答 2

1

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

您不能使用“正常”来执行此操作,javaparser因为它javaparser解析 Java 语法而FOR(i, 10, 3, >, -);不是 Java 语法。所以“正常”javaparser将无法解析这个。

您需要做的是创建自己的 fork/版本javaparser并修改java.jj语法以包含您的“不正确的 for”语句。检查此片段以了解正常情况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 循环的方法。结果将是一个包含类似内容的 AST IncorrectForStmt(您需要实现此类)。

在测试中,您需要解析源代码,然后分析生成的 AST 以定位IncorrectForStmt. 要验证您需要检查IncorrectForStmt.

于 2017-12-30T13:52:43.947 回答
1

[我是 JavaParser 的维护者] 您可以使用正则表达式进行搜索/替换,完全避免 JavaParser。不漂亮,但如果语法很简单,它会在大多数情况下工作。

于 2017-12-31T16:21:54.297 回答