我正在寻找一个动态组合Scala Parser Combinators的功能。例如,如果我想静做,我可以这样写:动态组合Scala的解析器组合器的功能是什么?
def aDirective: Parser[String] = "a" ^^ { case _ => "a" }
def bDirective: Parser[String] = "b" ^^ { case _ => "b" }
def combinedDirective: Parser[List[String]] =
aDirective ~ bDirective ^^ { case a ~ b => List(a, b) }
然而而非编码这个静态我希望能够动态地做到这一点,生成解析器组合的目的。
例如:
def aDirective: Parser[String] = "a" ^^ { case _ => "a" }
def bDirective: Parser[String] = "b" ^^ { case _ => "b" }
def combinedDirective: Parser[List[String]] =
combine(List(aDirective, bDirective))
def combine(parsers: List[Parser[T]): Parser[List[T]] = ???
我认为我需要从解析器的名单要到结果列表的解析器。所以我试图为一个名为combine
的函数写一个签名。我不知道如何实现combine
函数。无论我尝试什么方式,似乎都充满了我现在无法想出如何解决的问题。例如,如何构建折叠的初始解析器?我试图尝试各种foldLeft
和reduceLeft
构造,但似乎无法完成。
我正在使用Scala 2.11。有任何想法吗?
对于您提供的Scalaz示例,我收到了一些编译错误。我正在使用Scala 2.11和Scalaz 7.0.6。你和我的唯一区别就是我使用'class'而不是'object',不知道这个问题应该重要吗?我看到的编译错误是: – adamretter
错误:(14,71)隐式未找到:scalaz.Unapply [scalaz.Applicative,TestParser.this.Parser [T]]。无法不应用类型'TestParser.this.Parser [T]'到类型'scalaz.Applicative'分类的类型为'M [_]'的类型构造器中。通过编译'隐式[scalaz.Applicative [type constructor]]'来检查类型类是否定义,并检查对象UnApply中的含义,该对象只覆盖常见类型的“形状”。 def combine [T](parsers:List [Parser [T]]):Parser [List [T]] =解析器。序列U ^ – adamretter
错误:(14,71)方法sequenceU没有足够的参数:(隐式G:scalaz.Unapply [scalaz.Applicative,TestParser.this.Parser [T]])G.M [List [G.A]]。 未指定的值参数G. def combine [T](解析器:List [Parser [T]]):Parser [List [T]] = parsers.sequenceU ^ – adamretter