具有依赖标记的解析器

时间:2015-09-17 15:01:10

标签: parsing sbt

inputTask的构建解析器功能强大且易于使用。

但是现在我有一个用例,我不知道要表达:

我想创建一个这样的解析器:

token(Space ~> language) ~ token(Space ~> number).+

其中language可以是这3个值中的一个:

  • 西班牙语

number可以是这三个值中的一个:

  • 一,二,三英语
  • un,deux,trois for French
  • uno,dos,tres for Spanish。

我们的解析器可以很容易地写成:

token(Space ~> StringBasic.examples(FixedSetExamples("English", "French", "Spanish")) ~ 
token(Space ~> number).+

但我不知道如何撰写number,因为它取决于language的值。

示例输入:

  • 英文一一
  • 西班牙语dos
  • French trois deux

我认为这一定是可能的,因为命令或输入任务的参数取决于命令类型。我研究过SBT的源代码,但很难理解。

更多信息:

1 个答案:

答案 0 :(得分:1)

您可以使用flatMap并创建第二个基于第一个解析器的解析器:

val languageNumbersParser = {
    import complete.DefaultParsers._
    val languages: Parser[String] = literal("English") | "French" | "Spanish"
    val engNums: Parser[String] = literal("one") | "two" | "three"
    val freNums: Parser[String] = literal("un") | "deux" | "trois"
    val spaNums: Parser[String] = literal("uno") | "dos" | "tres"
    token(Space ~> languages) flatMap {
      case "English" => success("English") ~ token(Space ~> engNums).+
      case "French" => success("French") ~ token(Space ~> freNums).+
      case "Spanish" => success("Spanish") ~ token(Space ~> spaNums).+
    }
}
相关问题