在地图上匹配的解析器组合器

时间:2013-10-08 14:56:18

标签: regex scala parser-combinators

我正在使用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
}

我可以完全抛弃明确的正则表达式吗?也许写自定义Parser?

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

1 个答案:

答案 0 :(得分:0)

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

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

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