Приостановить / продолжить анализ PEGKit Parser?

У меня есть парсер, созданный из PEGKit (пример проекта здесь).

Я хочу приостановить разбор, не останавливая основной поток. поскольку PEGKit имеет бесконечный возврат и знает, где курсор / голова находится во входной строке, должна быть возможность возобновить анализ.

Было бы очень полезно, чтобы я мог создать пошаговый парсер. Таким образом, синтаксический анализатор должен ждать действия пользовательского интерфейса, как нажатие UIButton,

Как реализовать или приостановить, а затем возобновить анализ?


В качестве примера я хотел бы приостановить синтаксический анализ при достижении определенного символа. Вот бы после ; (точка с запятой или EXPRESSIONPARSER_TOKEN_KIND_SEMI_COLON).

Так что после токена ; Это должно сохранить состояние, чтобы я мог вернуться и разобрать с этой позиции.

Код:

- (void)start {
    [self main_]; 
    [self matchEOF:YES]; 
}

- (void)__main {

    while ([self speculate:^{ [self expression_]; }]) {
        [self expression_]; 
    }

    [self fireDelegateSelector:@selector(parser:didMatchMain:)];
}

- (void)__expression {

    if ([self speculate:...) {
        if ([self predicts:...) {
            [self _subExpression];
        } else {
            [self raise:@"No viable alternative found in rule 'expression'."];
        }
    }
    [self match:EXPRESSIONPARSER_TOKEN_KIND_SEMI_COLON discard:NO];

    [self fireDelegateSelector:@selector(parser:didMatchExpression:)];
}

1 ответ

Решение

Разработчик PEGKit здесь.

Я думаю, когда вы об этом подумаете, будет очевидно, что потоки PEGKit + - это то, что вы ищете. И что для этого не нужно добавлять дополнительные функции в PEGKit.

Вы ищете возможность приостановить и возобновить выполнение анализа с помощью PEGKit. У вас уже есть доступ к этой функции с потоками.

Просто выполните синтаксический анализ фонового потока и приостановите его, вызвав метод, который блокируется, пока пользователь не укажет, что он хочет продолжить. По сути, это тот же тип среды / опыта, который предоставляет терминал: выполнить и приостановить, ожидая ввода данных пользователем. (Я сам реализовал это с помощью некоторых утилит, размещенных здесь.)

Поэтому я думаю, что добавление всех функций, которые потоки предоставляют непосредственно в PEGKit, было бы неправильным подходом.

Если вы хотите отслеживать состояние анализа PEGKit, просто управляйте стеком имен методов в обратных вызовах делегата анализатора.

Другие вопросы по тегам