Нечувствительный к регистру парсер-комбинатор Scala - PullRequest
5 голосов
/ 21 мая 2011

Я пытаюсь создать язык , и есть некоторые его части, которые я хочу учитывать без учета регистра.Я уверен, что это что-то легкое, но я не смог найти это.

Редактировать: Перечитывание заставляет меня стыдиться этого вопроса. Здесь - неудачный тест, объясняющий, что я имею в виду.

1 Ответ

15 голосов
/ 21 мая 2011

Используйте регулярное выражение вместо литерала.

lazy val caseSensitiveKeyword: Parser[String] = "casesensitive"
lazy val caseInsensitiveKeyWord: Parser[String] = """(?i)\Qcaseinsensitive\E""".r

(См. Документы для java.util.Pattern для получения информации об используемом синтаксисе регулярных выражений.)

Если вы делаете это часто, вы можете pimp String, чтобы упростить синтаксис:

class MyRichString(str: String) {
  def ignoreCase: Parser[String] = ("""(?i)\Q""" + str + """\E""").r
}

implicit def pimpString(str: String): MyRichString = new MyRichString(str)

lazy val caseInsensitiveKeyword = "caseinsensitive".ignoreCase
...