Просто записал руководству по этому на моем блог , вот сокращенная версия:
Часть 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'.
Последний пример не проблема, я думаю:
/* 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;
... что является недопустимым кодом. Так что лучше замените свои комментарии на ""
вместо ""
.
Я думаю, что 100% правильное решение с использованием регулярных выражений либо бесчеловечно, либо невозможно (с учетом экранирования и т. д.).
Я считаю, что лучшим вариантом будет используя ANTLR - я считаю, что они даже предоставляют грамматику Java, которую вы можете использовать.
Другой альтернативой является использование некоторой библиотеки, поддерживающей синтаксический анализ AST, например, org.eclipse.jdt.core имеет все API-интерфейсы, необходимые для этого и многого другого. Но тогда это всего лишь одна альтернатива :)
Возможно, вы уже отказались от этого, но проблема меня заинтриговала.
Я считаю, что это частичное решение ...
Собственное регулярное выражение:
//.*|("(?:\\[^"]|\\"|.)*?")|(?s)/\*.*?\*/
В Java:
String clean = original.replaceAll( "//.*|(\"(?:\\\\[^\"]|\\\\\"|.)*?\")|(?s)/\\*.*?\\*/", "$1 " );
Кажется, это правильно обрабатывает комментарии, встроенные в строки, а также правильно экранированные кавычки внутри строк. Я бросил на это несколько вещей, чтобы проверить, но не до конца.
Есть один компромисс в том, что все блоки в коде заканчиваются пробелом после них. Сохранять эту простую задачу и решить эту проблему было бы очень сложно, учитывая необходимость аккуратной обработки:
int/* some comment */foo = 5;
Простой цикл Matcher.find / appendReplacement может условно проверять наличие группы (1) перед заменой пробелом и будет состоять только из нескольких строк кода. Может быть, все еще проще, чем полный анализатор. (Я мог бы добавить и цикл сопоставления, если кому-то интересно.)