БлогNot. JavaScript: выравниваем Си-подобный код

JavaScript: выравниваем Си-подобный код

Речь всего лишь о том, чтобы выровнять в соответствии с блочными разделителями Си-подобных языков "{" и "}" произвольно набранный код.

А ведь это всего лишь задача на посимвольную обработку текста, которую всегда можно решить за время O(n). Но эта работа Левши может потребовать времени больше, чем его пройдёт до исчерпания актуальности проблемы, вот поэтому-то все реальные компиляторы и многопроходные, а в GCC 20+ проходов, по количеству разработчиков :)

Вот сколько проходов понадобилось мне:

  • 1. Выделить части без скобок {} и массив самих скобок;
  • 2. Посчитать уровни вложения скобок;
  • 3. Учесть переводы строк в частях отдельных лексем, ведь никто не запрещает использовать операторные скобки много раз в одной строке, но все вложенные блоки должны быть выровнены с учётом переводов строк;
  • 4. Отфильтровать пустые строки, возникшие в результате всего этого безобразия.

Скрипт выравнивает код в стиле

{
  level1
  {
    level2
  }
}

возможно, он недоработан, ибо писался вчера ночью. Тестовый текст в поле ввода вставлен довольно маразматичный, можно, конечно, и другой попробовать, а потом нажать "Выполнить". Исходник можно увидеть из исходника страницы со скриптом, кодировка Юникода UTF-8.

 Открыть скрипт alignBrackets в текущем окне/вкладке (3 Кб)

Несколько функций из кода в скрипте не пригодились, но стирать из исходника жалко:

  • String.prototype.rtrim //убрать разделители справа
  • String.prototype.ltrim //убрать разделители слева
  • String.prototype.bracketsAndSpacesDelete //Убрать разделители и {}


теги: textprocessing алгоритм javascript сервис

30.05.2020, 18:21; рейтинг: 120