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