@Light-Effect

Есть ли простой алгоритм для парсинга блоков кода?

Есть ли какой то алгоритм парсинга вот такого примера:

function testA(a, b) {
    if (a === 1) {
        switch (b) {
            case 1:
                return;
        }
    }
}


Интересует алгоритм именно получени содержимого в каждых фигурных скобках Пример:

1:
{
    if (a === 1) {
        switch (b) {
            case 1:
                return;
        }
    }
}

2.

{
        switch (b) {
            case 1:
                return;
        }
    }

3.

{
            case 1:
                return;
        }
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ответы на вопрос 2
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
js linter нужен чтобы разобрать на токены. если колхозить, то самый простой алгоритм - это разбить регуляркой на токены, потом в цикле искать пары скобок - т.е. каждый элемент массива это координаты(строка, символ) начала и конца блока
Ответ написан
Комментировать
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Вам надо сопоставить каждой открывающей скобке - соответствующую закрывающую.
В простейшем случае это делается одним проходом по тексту со стеком.

Встретили открывающую скобку - положили ее позицию в стек. Встретили закрывающую - вынимаем последнюю позицию из стека. Кусок от этой позиции до текущей - ваш блок кода.

Этот алгоритм на вашем примере выведет именно то, что вам надо, но куски будут в обратном порядке, отсортированне по правому краю. Если надо сортировать именно как вы указали, то надо развернуть алгоритм - идите с конца и кладите в стек закрывающие скобки.

Можно алгоритм усложнить, если надо какую-то проверку на синтаксис делать. Тогда вам придется, во первых, разбить текст на токены. Во вторых класть в стек всякие разные открывающие токены. Например, туда еще пойдут '[', '(' в С или "begin" в паскале. Потом при встрече любого закрывающего токена нужно проверить, что на вершине стека лежит правильный открывающий токен.

Еще важно не забыть, что при некорректном входном коде у вас стек может кончится раньше времени. Например: "{a};}{". Тут, когда вы дойдете до второй скобки, у вас будет пустой стек. Это означает, что текст некорректен.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы