Как разобрать цикл for с помощью Javaparser?
Мне нужно использовать javaparser
разобрать неправильную форму for-loop
в правильной форме. Мой цикл имеет 5 аргументов:
- индекс цикла (i);
- начальное значение индекса. Это может быть другое значение (например, k) или int value (10);
- значение инварианта цикла (3);
- условие инварианта (>, <,>= или <=);
- операция, выполняемая после каждого запуска цикла (- или + изменится на 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");
}
}
2 ответа
[Я поддерживаю JavaParser] Вы можете использовать поиск / замену с помощью регулярных выражений, полностью избегая JavaParser. Не красиво, но если синтаксис прост, он будет работать большую часть времени.
Это возможно, но намного выше среднего уровня.
Вы не можете сделать это с "нормальным" javaparser
так как javaparser
разбирает синтаксис Java и FOR(i, 10, 3, >, -);
не является синтаксисом Java. Так что "нормально" javaparser
не сможет разобрать это.
Что вам нужно будет сделать, это создать свой собственный форк / версию javaparser
и изменить java.jj
грамматика, чтобы включить ваше "неверно для" утверждения. Проверьте этот фрагмент на предмет нормального 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
,