2016-07-14 2 views
0

Проблема:Исходный код синтаксического анализа и форматирования

  1. Прочитайте файл исходного кода (например, .java)
  2. Удалить все пустые строки из него
  3. Удалить все комментарии из него
  4. удалить ненужные пробелы между петлями
    Пример

    for (int i = 0, int j = 0 ; i < = data.length, j < 44; i++ , j++) 
    

    становится

    for(int i=0,int j=4;i<=data.length,j<44;i++,j++) 
    
  5. Изменение скреплений в:

    void sleep(){ 
        return; 
    } 
    

    в

    void sleep() 
    { 
        return; 
    } 
    

Я сделал функции для к , которые работают с использованием регулярных выражений.

Но для , я написал отдельную функцию String fixFor (String forCode), и мне нужно изменить все fors вручную.
Кто-нибудь знает программное решение, то есть программу Java, чтобы сделать это, не используя функцию поиска и замены текстового редактора? Я читаю мой файл исходного кода в строку с помощью:

String s=new String(readAllBytes(get("Code.java"))); 

Также для , легко заменить все { с {\n но отступ не остается в силе.

+2

Ну, если вы вызываете 'for (int i = 0, int j = 4; i <= data.length, j <44; i ++, j ++)' отформатирован, тогда я могу только сказать: wow ... – Tom

+0

Во-первых, мой вопрос не вызывает (int i = 0, int j = 4; i <= data.length, j <44; i ++, j ++) в формате format.It вместо этого указывает на удаление пробелов между ними. А во-вторых, если вам трудно понять этот «отформатированный» для кода, тогда я могу только сказать, ничего себе! – hhj8i

+0

Если вы хотите удалить все пробелы, просто замените \ S ничем, и вы пойдете! Если это слишком много, то я сожалею и не понимаю, почему вы хотите это сделать в первую очередь :) – NoRelect

ответ

1

Вопрос немного расплывчатый, поскольку я не уверен, что код решения должен просто использовать текстовый редактор с макросом или его исходный код на Java вам нужен в любом случае.

Для 4 Вы можете использовать шаблон для итерации по строке и поиска экземпляров из списка ключевых слов на любом языке, который вы разборете, а затем обрабатывать любую группу, независимо от того, означает ли это замену группы внутри строки или копировать их и реформировать исходную строку сохраняя только совпавшие группы немодифицированных:

/* 
* StackOverflow example 
* 
* 
*/ 
package javaapplication5; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

/** 
* 
* @author dean2191 
*/ 
public class JavaApplication5 { 

    public static void main(String[] args) { 
     String code = "for (int i = 0, int j = 0 ; i < = data.length, j < 44; i++ , j++) "; 
     List yourKeywords = new ArrayList(); 
     yourKeywords.add("int"); 
     yourKeywords.add("boolean"); //any keywords,could read them from a file 
     Iterator<String> iterator = yourKeywords.iterator(); 

     Pattern pattern = Pattern.compile("(" + iterator.next() + "\\s"+"[a-zA-Z0-9]" + ")"); 
     Matcher m = pattern.matcher(code); 

     while (iterator.hasNext()) { 

      if (m.find()) { 
       System.out.println("group to keep found:"+m.group()); 
      } 
     } 
    } 

} 

выход этот код будет:

group to keep found:int i 
group to keep found:int j 

Как уже упоминалось выше, вы можете затем скопировать эту группу и создать новую строку убедившись, что эти группы являются единственной частью, не лишенной пробелов, если это то, что вы действительно хотите.

Однако, в зависимости от того, сколько парсинга вы действительно хотите сделать с языком, может оказаться целесообразным рассмотреть решение, такое как ANTLR для более надежного решения синтаксического анализа.

+1

Ваше решение дало мне идею разбивать мой исходный код на отдельные строки, а затем проверять использование if (строка [i] .contains ("for (")) line [i] = fixFor (строка [i]); – hhj8i