Страницы

Поиск по вопросам

понедельник, 18 февраля 2019 г.

Алгоритм выделения блока кода из позиции курсора?

Допустим, есть код следующий | - каретка
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 - найдена закрывающая скобка.
Не сработает при наличии скобок в комментариях или строковых литералах, например. Тут нужно дополнительно разбираться...

Комментариев нет:

Отправить комментарий