Страницы

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

четверг, 9 января 2020 г.

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

#алгоритм #синтаксический_анализ


Допустим, есть код следующий
| - каретка  

function a () {
 let b = 20;
 |
}


В таком случае легко написать алгоритм выделения блока { let b = 20 } просто пройти
сначала направо или налево, найти положение открывающей/закрывающей скобки, сделать
counter равный 1 и потом пойти в обратную сторону прибавляя или уменьшая счетчик в
зависимости от того, какая скобка попадается в очередной раз и когда он будет 0 означает
что блок закрылся.  

Это так же сработает и для { | {} {} {} }

Но это не будет работать для { {} | {} }, как быть в этом случае? Есть ли вообще
решение без разбиения всего кода на токены, выделение блоков, ast и прочее? Ну и как
вообще лучше данную задачу решить?
    


Ответы

Ответ 1



Ну почему же не сработает? Открывающая скобка - +1, закрывающая - -1. Идем в вашем случае влево, получается последовательность (пишу значение после обработки каждой скобки по пути) -1, 0, +1. Все, стоп! +1 - найдена искомая открывающая скобка. Идем вправо, имея +1. Далее - +2, +1, +2, +1, 0. Стоп! 0 - найдена закрывающая скобка. Не сработает при наличии скобок в комментариях или строковых литералах, например. Тут нужно дополнительно разбираться...

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

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