Как настроить 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/;
Надеюсь, это поможет.