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