Регулярное выражение для определения класса в Java - PullRequest
1 голос
/ 11 августа 2009

Проблема заключается в следующем:

В Java существует обширная кодовая база (сотни файлов в десятках пакетов), где нам нужна возможность добавлять и удалять ключевое слово strictfp в каждом определении класса. Я планирую использовать sed или awk для выполнения этой замены. Однако я хотел бы избежать замены слова «класс» в комментариях или где-либо еще. Кто-нибудь может придумать решение для этого?

Ответы [ 8 ]

2 голосов
/ 11 августа 2009

Для такой задачи я бы сначала порекомендовал написать небольшую программу, которая проверяет, все ли файлы *.class в дереве каталогов действительно имеют (или не имеют) правильную настройку strictfp. Затем, что бы вы ни решили сделать для решения проблемы изменения исходного кода, вы можете запустить средство проверки после компилятора, чтобы убедиться, что вы сделали правильно.

Это на самом деле просто TDD, примененный к вашей конкретной проблеме.

1 голос
/ 11 августа 2009

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

1 голос
/ 11 августа 2009

Я могу представить две возможности:

  • Используйте синтаксический анализатор, а не регулярное выражение (RE не предназначены для всего ). Парсер будет намного лучше понимать синтаксис языка.
  • Сделайте вашу кодовую базу согласованной, чтобы вы не брали ошибочные строки «класса».

Ни один из них не очень удовлетворителен. Первое на самом деле довольно сложно написать, второе трудно понять.

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

Затем введите стандарты кодирования и постепенно измените все несоответствующие определения на правильные.

1 голос
/ 11 августа 2009

Как полный улов, нет, для этого не существует RegEx. По сути, вам нужно написать интерпретатор Java (или, по крайней мере, парсер), чтобы учесть любую теоретическую конструкцию класса. При этом, вы действительно должны быть в безопасности, если слово class является первым непробельным битом в строке или если ему предшествует модификатор доступа, который является первым непробельным битом в строке.

1 голос
/ 11 августа 2009

Невозможно быть уверенным в том, что вы получите 100% прав без Java-парсера. Но следующее может быть достаточно близко:

sed -i.bak 's/\\(public\\|private\\|protected\\)\\(.*\\)class/\\1 strictfp \\2 class/g' $file

Я думаю, что у меня все получилось, но я пишу это с Windows-машины и не проверял.

Вышеприведенное сработает, если у вас есть комментарии с «public / private / protected» и «class».

1 голос
/ 11 августа 2009

Насколько стандартно форматирование вашего кода? Например, не могли бы вы найти «класс» в строке, которая заканчивается на { или где следующая строка начинается на { или что-то подобное?

0 голосов
/ 13 августа 2009

Просто чтобы люди знали, я решил в конце концов пойти с Javassist вместо BCEL, поскольку Javassist, кажется, намного проще в использовании и вполне подходит для моих целей. http://csg.is.titech.ac.jp/~chiba/javassist. Если кому-то интересно, код будет выглядеть примерно так:


    import javassist.*;
    ClassPool cp = new ClassPool(); 
    CtClass someClass = cp.get("SomeClass"); 
    someClass.setModifiers(Modifier.STRICT);
0 голосов
/ 13 августа 2009

Starblue: Спасибо! Посмотрев BCEL, я нашел JMangler, который идеально подходит, поскольку я могу изменить существующие файлы .class, добавив модификатор strictfp. http://javalab.cs.uni -bonn.de / исследования / jmangler / учебник / using.html

...