Допустим, есть код следующий
| - каретка
function a () {
let b = 20;
|
}
В таком случае легко написать алгоритм выделения блока { let b = 20 } просто пройти сначала направо или налево, найти положение открывающей/закрывающей скобки, сделать counter равный 1 и потом пойти в обратную сторону прибавляя или уменьшая счетчик в зависимости от того, какая скобка попадается в очередной раз и когда он будет 0 означает что блок закрылся.
Это так же сработает и для { | {} {} {} }
Но это не будет работать для { {} | {} }, как быть в этом случае? Есть ли вообще решение без разбиения всего кода на токены, выделение блоков, ast и прочее? Ну и как вообще лучше данную задачу решить?
Ответ
Ну почему же не сработает?
Открывающая скобка - +1, закрывающая - -1. Идем в вашем случае влево, получается последовательность (пишу значение после обработки каждой скобки по пути) -1, 0, +1. Все, стоп! +1 - найдена искомая открывающая скобка.
Идем вправо, имея +1. Далее - +2, +1, +2, +1, 0. Стоп! 0 - найдена закрывающая скобка.
Не сработает при наличии скобок в комментариях или строковых литералах, например. Тут нужно дополнительно разбираться...
Комментариев нет:
Отправить комментарий