0

我正在使用 Scala 的模式组合器编写罗马化工具。

在其中一个解析器中,我希望能够匹配一组字符串值并将它们转换为相应的值。

也就是说,我使用 Map[String, String] 在这些值之间进行转换,但我没有找到一种方法来匹配地图的键而不使用单独的正则表达式。

object Transliteration extends RegexParsers {
  private[text] val diphthongsMap = Map(
    "ай" -> "ay",
    "ей" -> "ey",
    "ий" -> "iy",
    "ой" -> "oy",
    "уй" -> "uy",
    "ый" -> "yi",
    "эй" -> "ey",
    "юй" -> "yuy",
    "яй" -> "yay"
  )

 def diphthong: Parser[String] =
    """ай|ей|ий|ой|уй|ый|эй|юй|яй""".r ^^ { diphthongsMap(_) }

 def text: Parser[String] =
    rep1(notSymbols, extendedWord) ^^ { _.mkString }

 [... bunch of other parsers ...]

  def translatePhrase(phrase: String): String =
    parseAll(text, phrase).get
}

我可以完全放弃显式正则表达式吗?也许写自定义解析器?

编辑:我并不完全清楚我只是想要更有效的编码diphthong方法而不需要硬编码,而不是重写程序的整个逻辑。

4

1 回答 1

0

可能不需要自定义解析器。一种解决方案是在地图上折叠:

def romanize(cyrillicString: String) = 
  diphthongsMap.foldLeft(cyrillicString) { 
    case (s, (from, to)) => s.replace(from, to) 
  }

尽管此解决方案效率不高,但运行时间约为 O(N^2),尽管可以用于较短的文本,因为设置解析器或正则表达式的成本可以摊销。

于 2013-10-08T15:14:16.250 回答