2017-12-30 62 views
0

の正当な形式を正しい形式に解析するには、javaparserを使用する必要があります。私のループには5つの引数があります:Javaparserを使ってforループを解析するには?

  1. ループのインデックス(i);
  2. インデックスの初期値。それは他の値(例えば、k)でもint値(10)でもかまいません。
  3. ループの値invariant(3);
  4. 不変式(>、<、> =または< =)の条件。
  5. 操作、各ループ実行後に実行されます( - または+はi--またはi ++に変更されます)。

enter image description here

私は2つのクラスを作成しました。最初のものは不正なループであり、2番目のものは正しいループ(解析後)です。私は最初にこの2つのクラスを書いて、解析の前後にどのようにコードを見て、次に解析するためのコードを書くべきかを調べました。しかし、私はそれが良いスタートであるとは確信していません、私はfor-loopの修正を表しました。 明確化: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"); 
    } 
} 
+0

明確にするために、突然コードをjavaに解析しようとしていますか? – MartinByers

+0

Class.javaのコードをClassAltered.javaに解析したいと思います。しかし、最初はこの2つのクラスを正確に記述したいと思います。 – Viola

+0

私が言う最初のことは、2つの理由から、クラス "クラス"を決して呼び出さないということです。まず、それが何を表しているか記述していない、2番目にはすでにjava.lang.Classがあります。 – MartinByers

答えて

1

これは可能であるが、十分に平均タスク上記。

javaparserは、javaparserがJava構文を解析し、FOR(i, 10, 3, >, -);がJava構文ではないため、「通常」のjavaparserでは実行できません。だから "普通" javaparserはこれを解析することができません。

あなたがする必要があるのは、独自のフォーク/バージョンのjavaparserを作成し、java.jjの文法を変更して「間違った」という文を追加することです。通常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をより簡単に拡張可能にする方法を考えていますが、現在これが唯一の方法です。 Javaコードが混じっていることが明らかになっていないJavaコードがあるのはなぜかと思います。私はそれがいくつかのツールで生成されたと思うので、Javaで奇妙な非Javaコードを取得する前に、この問題を解決しようとします。もちろん、大文字で "FOR"を探すためにいくつかのハックを行うこともできますが、脆いものが得られます。 –

+0

@Viola私はあなた自身の文法を作らなければそれができないと確信しています。 JavaParserはJavaCCベースであるため、文法に邪魔されることはありません。 – lexicore

1

[私はJavaParserの管理者です] JavaParserをすべて避けて、正規表現で検索/置換することができます。しかし、構文がシンプルであれば、ほとんどの時間がかかるでしょう。

関連する問題