Соответствие токенов без учета регистра
Можно ли установить грамматику так, чтобы она не зависела от регистра?
так например правило:
checkName = 'CHECK' Word;
будет соответствовать check name
так же как CHECK name
1 ответ
Создатель PEGKit здесь.
Единственный способ сделать это в настоящее время - использовать семантический предикат в обходном порядке:
checkName = { MATCHES_IGNORE_CASE(LS(1), @"check") }? Word Word;
Некоторые объяснения:
Семантические предикаты - это функция, взятая непосредственно из ANTLR. Семантическая предикатная часть
{ ... }?
, Они могут быть размещены в любом месте ваших правил грамматики. Они должны содержать либо одно выражение, либо серию операторов, оканчивающихся наreturn
утверждение, которое оценивает к логическому значению. Этот содержит одно выражение. Если выражение оценивается как ложное, соответствие текущего правила (checkName
в этом случае) не получится. Истинное значение позволит продолжить сопоставление.MATCHES_IGNORE_CASE(str, regexPattern)
это удобный макрос, который я определил для вашего использования в Предикатах и Действиях для выполнения регулярных выражений. У него есть чувствительный к регистру друг:MATCHES(str, regexPattern)
, Второй аргументNSString*
шаблон регулярных выражений. Смысл должен быть очевидным.LS(num)
еще один удобный макрос для использования в Predicates/Actions. Это означает получить строку Lookahead, а аргумент указывает, насколько далеко заглядывать вперед. ТакLS(1)
означает предвкушение1
, Другими словами, "извлеките строковое значение первого следующего токена, который парсер собирается попытаться сопоставить".Обратите внимание, что я все еще совпадаю
Word
дважды в конце там. ПервыйWord
необходим для сопоставления 'check' (хотя он уже был проверен в предикате, он не был сопоставлен и использован). ВторойWord
для вашегоname
или что угодно.
Надеюсь, это поможет.