Соответствие токенов без учета регистра

Можно ли установить грамматику так, чтобы она не зависела от регистра?

так например правило:

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 или что угодно.

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

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