Как настроить PKTokenizer в ParseKit для токенизации подстрок?

Скажем, я хочу проанализировать подстроки с помощью ParseKit, как префикс слова. Так, например, я хочу разобрать "предварительный просмотр" и "обзор". Так что моя грамматика может быть:

@start  = prefix 'view';
prefix = 'pre' | 're';

Теперь без изменения ParseKit я могу сопоставить "предварительный просмотр" и "повторный просмотр", но не "предварительный просмотр" или "обзор". Из документации я думаю, что мне нужно настроить состояние слова в PKTokeinzer, потому что он ищет пробелы для завершения токена "Word". Как мне обойти это?

1 ответ

Решение

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

Я не уверен, что полностью понимаю вопрос, но думаю, что это звучит несколько ошибочно.

Если вы ищете способ сопоставления с суб-токенами или символами, регулярные выражения могут быть более подходящими для ваших нужд, чем ParseKit.

Грамматика ParseKit совпадает с токенами, созданными токенайзером ParseKit (PKTokenizer учебный класс). Не отдельные персонажи.

Дело не в том, что это невозможно PKTokenizer производить pre и и view токен от ввода preview, Но это потребовало бы настройки кода, который я бы назвал неразумным и излишне сложным. Я думаю, что это плохая идея.

Если вы все равно хотите использовать ParseKit (а не Regex), вы можете просто выполнить суб-разбор в ваших обратных вызовах ассемблера (а не в грамматике).

Итак, в грамматике:

@start = either;
either = 'preview' | 'review';

И в ObjC:

- (void)parser:(PKParser *)p didMatchEither:(PKAssembly *)a {
    PKToken *tok = [a pop];
    NSString *str = tok.stringValue;

    if ([str hasPrefix:@"pre"]) {
        ... // handle 'preview'
    } else {
        ... // handle 'review'
    }
}

Также помните, что грамматики ParseKit поддерживают сопоставление токенов через RegEx. Так что если вы хотите сопоставить все слова, которые заканчиваются на view:

@start = anyView;
anyView = /\b\w*?view\b/;

Надеюсь, это поможет.

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