组合Scala解析器组合器

组合Scala解析器组合器,scala,parsing,functional-programming,combinators,Scala,Parsing,Functional Programming,Combinators,我想用scala解析器组合符解析字符串。让我们拿 abcd,123,ghijk 例如。我们有两个单词和一个用逗号连接的整数 我可以这样做: import scala.util.parsing.combinator._ case class MyObject(field1:String, field2:Integer, field3:String) object Test3 extends RegexParsers { def main(args:Array[String]) {

我想用scala解析器组合符解析字符串。让我们拿

abcd,123,ghijk

例如。我们有两个单词和一个用逗号连接的整数

我可以这样做:

import scala.util.parsing.combinator._

case class MyObject(field1:String, field2:Integer, field3:String)

object Test3 extends RegexParsers {
    def main(args:Array[String]) {
      val testRow = "abcd,123,ghijk"

      val parseResult = Test3.parse(Test3.myObject, testRow)

      println(parseResult)
    }

    def word = "\\w+".r ^^ { _ toString }
    def int = """\d+""".r ^^ { _ toInt }
    def comma = "," ^^ { _ toString }

    def myObject = word ~ comma ~ int ~ comma ~ word ^^ { 
      case wordfield1 ~ sep1 ~ intfield ~ sep2 ~ wordfield2
      => MyObject(wordfield1, intfield, wordfield2)
    }
}
但是,我想使用逗号连接的逻辑。因此,与其显式书写word~逗号~int~逗号~单词,不如让它看起来更像

List(word, int, word) someFunctionIDontKnow {
    (resultParser, nextParser) => resultParser ~ comma ~ nextParser
}

我有点被困在这里,因为我不知道如何使用不同的类型保存解析器:Parser[int]和Parser[String]到一个列表中,同时保持类型安全性,以及使用什么函数来组合这些类型,就像我手动做的那样。我想要的是可能的还是我走错了方向?

使用组合器。@Boristeider谢谢,但我还不知道如何使用它。似乎repsep可以用于由另一个解析器分隔的同一个解析器的repitition,但我有不同的解析器word和int,它们由另一个逗号分隔。我如何使用repsep来组合这些不同的解析器?如果您想保留类型,repsep不会有帮助。~或者,如果你不想全力以赴寻找一个基于形状的解决方案,它可以让你使用元组,但需要编写一些你自己的通用代码,那么理解可能是你最好的选择。e word,int,word,word,int,word,word,int,word,…,否则我不确定您所问的内容是否符合您的需要。我看到您询问如何将各种类型的对象保存到单个列表中。它与解析器组合器有什么关系?看起来你正在使用解析器组合器作为骗局石头,狡猾的格林兄弟用它来恶作剧村民,给他们煮石头汤。否则,请使用带解析器的extends App清理代码,而不是使用def main、~>int删除JavaTokenParser中的标点符号和现成的int和ident单词。我认为.r解析器已经生成了字符串,您可以通过应用u.toInt来假设它。