Как сделать грамотно для строк исxодника JavaScript?
Начал с простого, написал функцию, которая вычисляет индент для текущей строки исxодя из её содержимого, содержимого предыдущей строки и в некоторых случаях содержимого предшествующей предыдущей строке. Вот примерно так:
(get-positive-indent)
(get-negative-indent)
(get-indent-for-actual-line)
они возвращают относительное значение, на которое изменяю текущее значение индента. В первой функции ищу в предыдущей строке наличие { if if() for for() do with with() while while() case: default:. Во второй подсчитываю количество } и на их количество минус один уменьшаю индент. В третьей смотрю, начинается ли строка с } или с case: или с default:.
Вроде бы несложно, но дьявол, как известно, в деталях. В процессе анализа строк приходится вырезать несущественный мусор (строки, коментарии, replace(/ /, match(/ /), если попадается такая конструкция: // */ то надо сканировать строки назад и искать, есть ли начало многострочного коментария, чтобы определить, правую или левую часть строки отрезать. Если текущая строка начинается с case: или default: заканчивается или нет предыдущая строка switch(){. Является ли предыдущая строка однострочным блоком кода не обрамлённая { }. А тут сейчас задумался как делать:
..foo( bar,
.......jazz ); // тут индент на уровне аргумента bar
..X // а тут на уровне foo, что уже требует
// запоминать / передавать уровень индента
// между вызовами функции рассчитывающей индент
и что-то начинаю думать, что велосипед получается с неправильными колёсами - квадратными.
Вопрос такой: продолжать, как делал, или тут задача грамотно решается принципиально по-другому? Скажем, строится AST исxодника и чё-то там с ним делается... Если последнее, нужны подробности.
Хочется иметь набор правил, перечень сущностей, над которыми надо применить правила и просто последовательно выполнить эти правила и получить результирующее значение.
зы: elisp