2017-12-30 75 views
0

의 올바르지 않은 양식을 올바른 양식으로 구문 분석하려면 javaparser을 사용해야합니다. 내 루프에는 5 개의 인수가 있습니다.Javaparser를 사용하여 for 루프를 구문 분석하는 방법은 무엇입니까?

  1. 루프의 인덱스 (i);
  2. 색인의 초기 값입니다. 다른 값 (예 : k) 또는 int 값 (10) 일 수 있습니다.
  3. 루프의 값 invariant (3);
  4. 불변량의 조건 (>, <,> = 또는 < =);
  5. 각 루프 실행 후에 수행되는 조작입니다 (- 또는 +는 i-- 또는 i ++로 변경됩니다).

enter image description here

나는 두 개의 클래스를 만들었습니다. 첫 번째 것은 부정확 한 루프가 있고 두 번째는 올바른 루프가 있습니다 (구문 분석 후). 먼저이 두 클래스를 작성하여 구문 분석 전후의 코드를 확인한 다음 구문 분석 용 코드를 작성하는 방법을 확인했습니다. 하지만 좋은 시작이라고 확신하지 못하고 for-loop correctry를 표현했습니다. 설명 : Class.java의 코드를 ClassAltered.java로 구문 분석하려고합니다.

uncorrect 루프를 사용하여 일급 :

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"); 
} 
} 

정확한 루프 상기 제 2 클래스 :

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"); 
    } 
} 
+0

명확히하기 위해 코드를 갑자기 java로 구문 분석하려고합니까? – MartinByers

+0

Class.java에서 ClassAltered.java로 코드를 구문 분석하려고합니다. 하지만 처음에는이 두 클래스를 올바르게 작성하고 싶습니다. – Viola

+0

내가 말할 첫 번째 것은 두 가지 이유로 "클래스"클래스를 호출하지 않는다는 것입니다. 첫 번째는 /가 무엇을 나타내는 지 설명하지 않고 두 번째로 이미 java.lang.Class이므로 혼동을 일으킬 수 있습니다. – MartinByers

답변

1

이 가능하지만, 또한 평균 작업 상술.

javaparser은 이 Java 구문을 구문 분석하고 FOR(i, 10, 3, >, -);이 Java 구문이 아니기 때문에 "보통"javaparser으로는 수행 할 수 없습니다. 그래서 "보통"javaparser은 이것을 분석 할 수 없습니다.

당신이해야 할 일은 javaparser의 고유 한 포크/버전을 만들고 java.jj 문법을 수정하여 "for for"문을 포함시킵니다. 일반 ForStatement 어떻게 생겼는지에 대한 this fragment을 확인하십시오

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에 대한 지식을 많이 필요가 없습니다 것입니다.

다음으로 문법이 완료되면 "잘못된"for-loop를 구문 분석 할 수있는 javaparser이 표시됩니다. 결과는 IncorrectForStmt과 같은 것을 포함하는 AST가됩니다 (이 클래스를 구현해야합니다).

테스트에서 소스 코드를 구문 분석 한 다음 결과 AST를 분석하여 IncorrectForStmt을 찾아야합니다. 서브 노드를 IncorrectForStmt으로 확인해야합니다.

+0

해답을 가져 주셔서 감사합니다.하지만 자신의 문법을 만들지 않고도 할 수 있다고 확신합니다. – Viola

+0

[JavaParser에 기여] Lexicore가 맞습니다. 올바른 방법은 JavaParser를 포크하는 것입니다. 우리는 JavaParser를보다 쉽게 ​​확장 가능하게 만드는 방법을 생각하고 있지만 현재이 방법 만 사용 가능합니다. 왜 내가 명확하게 자바 코드가 아닌 코드가 자바 코드와 섞여 있는지 궁금하다. 나는 그것이 일부 도구에 의해 생성 된 것 같아요, 그래서 당신은 자바에서 이상한 자바 코드를 얻기 전에 문제를 해결하려고 할 것입니다. 확실히 당신은 또한 대문자로 "FOR"를 찾기 위해 해킹을 할 수 있지만, 취성이있는 것을 얻을 것이다. –

+0

@Viola 나는 자신의 문법을 만들지 않고는 할 수 없다고 확신한다. JavaParser는 JavaCC 기반이므로이 방법으로 문법을 사용하게됩니다. – lexicore

1

[JavaParser의 관리자입니다] JavaParser alltogether를 피하면서 정규 표현식으로 검색/대체 할 수 있습니다. 예쁘지는 않지만 구문이 단순하다면 대부분의 경우 작동합니다.