Java - нахождение регулярного выражения комментирует в коде

Просто записал руководству по этому на моем блог , вот сокращенная версия:

Часть 1: Загрузите что потребности быть загруженными.

Загрузка и установка время выполнения Erlang. Загрузка и установка TextPad.

Загрузка .syn файл для Erlang и места это в системной папке TextPad. Для меня эта папка была C:\Program Files\TextPad 5\system. Я не совсем уверен, кто сделал этот syn файл (сайт находится на другом языке), но они сделали достаточно хорошее задание.

Часть 2: Настройте подсветку синтаксиса.

Открывают TextPad. Удостоверьтесь, что никакие файлы не открыты. Перейдите к меню 'Configure' и выберите 'Предпочтения'. В предпочтительном окне нажмите 'Document Classes'. Должен быть список в настоящее время распознанных языков. Нажмите кнопку 'New' (это правильно в соответствии со списком языков), и введите 'Erlang'. Щелчок применяется.

Щелчок '+' кнопка рядом с 'Классами документов'. Это должно развернуть список, и Erlang должен теперь быть на нем. Нажмите Erlang. Необходимо видеть список расширений файла, связанных с Erlang, нажать 'New' и ввести '*.erl'.

Теперь нажимают '+' кнопка рядом с 'Erlang' слева. Это должно развернуть список еще нескольких меню. Нажмите на 'Syntax'. Нажмите выпадающее меню и выберите erlang.syn. Если erlang.syn не там, то .syn файл не был правильно помещен.

Не стесняются редактировать некоторые другие опции синтаксиса настроить TextPad к Вашей симпатии.

Часть 3: Компиляция от TextPad.

Примечание: с 05.12.08 существуют серьезные проблемы с компиляцией в textpad. Оболочка Erlang так или иначе игнорирует новую компиляцию, когда это сделано в текстовой клавиатуре. Это только полезно для проверки ошибок, когда Вы хотите на самом деле выполнить код, скомпилируйте его в Shell Erlang.

В меню свойства снова, нажмите 'инструменты' слева.

Щелчок кнопка 'Add' и избранная 'Программа... '. Перейдите к erl5.6.5\erts-5.6.5\bin\папке и выберите erlc.exe. Избранное и одиночное нажатие новая запись в списке для переименования его. Нажмите кнопку 'Apply '.

Now click the ' +' рядом с Инструментами слева. Выберите erlc, или независимо от того, что Вы назвали новый инструмент (я назвал шахту 'Compile Erlang'). Поле параметров должно считать '$File', и начальное поле папки должно считать '$FileDir'.

16
задан brovar 1 November 2009 в 12:57
поделиться

4 ответа

Последний пример не проблема, я думаю:

/* we comment out some code
System.out.print("We can use */ inside a string of course");
we end the comment */

... потому что комментарий фактически заканчивается на "Мы можем использовать * / . Этот код не компилируется.

Но у меня есть другой проблемный случай:

int/*comment*/foo=3;

Ваш шаблон преобразует это в:

intfoo=3;

... что является недопустимым кодом. Так что лучше замените свои комментарии на "" вместо "" .

3
ответ дан 30 November 2019 в 17:05
поделиться

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

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

3
ответ дан 30 November 2019 в 17:05
поделиться

Другой альтернативой является использование некоторой библиотеки, поддерживающей синтаксический анализ AST, например, org.eclipse.jdt.core имеет все API-интерфейсы, необходимые для этого и многого другого. Но тогда это всего лишь одна альтернатива :)

0
ответ дан 30 November 2019 в 17:05
поделиться

Возможно, вы уже отказались от этого, но проблема меня заинтриговала.

Я считаю, что это частичное решение ...

Собственное регулярное выражение:

//.*|("(?:\\[^"]|\\"|.)*?")|(?s)/\*.*?\*/

В Java:

String clean = original.replaceAll( "//.*|(\"(?:\\\\[^\"]|\\\\\"|.)*?\")|(?s)/\\*.*?\\*/", "$1 " );

Кажется, это правильно обрабатывает комментарии, встроенные в строки, а также правильно экранированные кавычки внутри строк. Я бросил на это несколько вещей, чтобы проверить, но не до конца.

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

int/* some comment */foo = 5;

Простой цикл Matcher.find / appendReplacement может условно проверять наличие группы (1) перед заменой пробелом и будет состоять только из нескольких строк кода. Может быть, все еще проще, чем полный анализатор. (Я мог бы добавить и цикл сопоставления, если кому-то интересно.)

25
ответ дан 30 November 2019 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: