2012-06-15 2 views
-2

Возможно ли разобрать некоторый Java-код с регулярным выражением?Разбор кода Java с Java

Итак, давайте скажем, я хочу список int переменных из этого:

int abc1 = 1; 
int abc2 = abc1 + 1; 
int abd3 = abc1 + abc2; 

И я хочу, чтобы поместить их в ArrayList.

Так что-то вроде этого:

private void parse(String s){ 

    List<List<String>> variables = new ArrayList<List<String>>(); 

    list.add(new ArrayList<String>);//var type 
    list.add(new ArrayList<String>);//var name 
    list.add(new ArrayList<String>);//var data 

    Pattern p = Pattern.compile();//This is what I want 
    Matcher m = p.matcher(s); 

    while(m.find()){ 
     String match = m.group(); 
     Pattern p2 = Pattern.compile();//Here as well 
     Matcher m2 = p.matcher(s); 
     while(m2.find()){ 
      for(int i = 0; i < m.groupCount()){ 
       //add the variables to the lists 
      } 
     } 
    } 
} 

То, что я спрашиваю, что регулярное выражение, возможно, справиться с этой задачей?


Причина все это, так что пользователь может занять немного контроля над приложением, используя немного кода (в приложение для Android BTW)

Если не рекомендуется использовать регулярное выражение , то какой парсер я должен использовать?

+10

Как комментарий, существует множество [java parsers] (http://www.google.com/?q=java+parser). Я бы не пытался манипулировать регулярным выражением, чтобы сделать это. –

+0

Вам что читать java-файлы? –

+3

Какова мотивация этого? – Sikorski

ответ

4

Люди часто пытаются анализировать HTML, XML, C или java с помощью регулярных выражений.

С достаточными усилиями и трюками можно найти множество удивительных вещей со сложными комбинациями регулярных выражений. Но у вас всегда есть что-то очень неполное и неэффективное.

Regex не может обрабатывать сложные грамматики, использовать синтаксический анализатор, либо общий, либо specific to java.

4

Вы можете попробовать с регулярными выражениями, но может быть проще пользователю Java Parser. Вы можете попробовать JavaCC.

+0

Вы можете * тратить свое время * пытаться с регулярным выражением, но вы * не добьетесь успеха *. Это было доказано в 1956 году. Использование парсера не просто «проще», но и важно. – EJP

4

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

1

Я бы рекомендовал вам изучить генераторы парсеров, например. JavaCC. JavaCC позволяет описывать грамматику в стиле BNF и создавать классы Java в соответствии с ней. Есть также уже имеющиеся грамматики JavaCC для разбора кода Java, я думаю, что это даже пример или учебник, который поставляется с JavaCC.

2

Если вам действительно нужно использовать регулярное выражение, попробуйте что-то вроде (?<=int)\\w+, но я настоятельно рекомендую использовать некоторый Java-синтаксический анализатор.