inputTask
的构建解析器功能强大且易于使用。
但是现在我有一个用例,我不知道要表达:
我想创建一个这样的解析器:
token(Space ~> language) ~ token(Space ~> number).+
其中language
可以是这3个值中的一个:
和number
可以是这三个值中的一个:
我们的解析器可以很容易地写成:
token(Space ~> StringBasic.examples(FixedSetExamples("English", "French", "Spanish")) ~
token(Space ~> number).+
但我不知道如何撰写number
,因为它取决于language
的值。
示例输入:
我认为这一定是可能的,因为命令或输入任务的参数取决于命令类型。我研究过SBT的源代码,但很难理解。
更多信息:
答案 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).+
}
}