Сопоставить подстроки в грамматике PEGKit
Я пытаюсь построить грамматику, которая будет соответствовать подстрокам слова, и у меня не так много. удачи. Т.е. я пытаюсь найти совпадение в тексте "an", который успешно выполняется, но не совпадает в первых двух буквах "и"
expr = phrase*;
phrase = an|text;
an = 'an'
text = Any;
Я понимаю, что это основной пример.
1 ответ
Создатель PEGKit здесь.
Во-первых, я хочу сказать, что из этого краткого описания я подозреваю, что PEGKit, возможно, не лучший инструмент для этой работы.
PEGKit превосходен при сопоставлении на уровне токена, но менее полезен для сопоставления на уровне под токена (персонажа).
Если вам нужно выполнить большое количество совпадений под токенами, как описано здесь, регулярные выражения будут гораздо лучшим решением, и вы должны использовать их вместо PEGKit.
Однако, если вам нужно проверить несколько шаблонов суб-токенов в контексте более крупной проблемы с синтаксическим анализом токенов, то да, PEGKit, безусловно, может это сделать.
Итак, чтобы ответить на ваш конкретный вопрос:
Для этого вида соответствия под токенам в PEGKit вы должны использовать семантический предикат.
Семантические предикаты описаны в кратких документах в ознакомительном файле PEGKit. А вот предыдущий вопрос о переполнении стека, связанный с использованием семантических предикатов.
Семантические предикаты - это выражения Objective C, встроенные непосредственно в ваши грамматики PEGKit, которые возвращают логическое значение, указывающее, что сопоставление должно быть успешным или неудачным. Они завернуты в { ... }?
построить.
В этом случае вы можете использовать семантический предикат, чтобы соответствовать "префиксу" совпавшего Word
маркер:
expr = anPhrase*;
anPhrase = { [LS(1) hasPrefix:@"an"] }? Word;
Вот, anPhrase
будет соответствовать Word
токены, которые начинаются с an
,
LS(1)
macro (также описанный в файле readme для PEGKit) означает "Строка Lookahead 1". Он извлечет строковое значение первого лексема в качестве NSString
,