使用scala parser combinators我已經解析了一些文本輸入,並創建了一些自己的類型。結果打印罰款。現在我需要通過輸出,我認爲這是一個包含我創建的類型的嵌套結構。我如何去做這件事?
這就是我所說的解析器:Scala解析,如何通過已收集的內容
GMParser1.parseItem(i_inputHard_2) match {
case GMParser1.Success(res, _) =>
println(">" + res + "< of type: " + res.getClass.getSimpleName)
case x =>
println("Could not parse the input string:" + x)
}
編輯 我從MsgResponse(O2 Flow|Off)
會得到什麼是:
>(MsgResponse~(O2 Flow~Off))< of type: $tilde
什麼我回來從WthrResponse(Id(Tube 25,Carbon Monoxide)|0.20)
是:
>(WthrResponse~IdWithValue(Id(Tube 25,Carbon Monoxide),0.20))< of type: $tilde
爲了給這個問題的上下文提供一些輸入分析。我會想GET在Id
:
trait Keeper
case class Id(leftContents:String,rightContents:String) extends Keeper
這裏是正在創建Id
:
def id = "Id(" ~> idContents <~ ")" ^^ { contents => Id(contents._1,contents._2) }
這裏是解析器全:創建
object GMParser1 extends RegexParsers {
override def skipWhitespace = false
def number = regex(new Regex("[-+]?(\\d*[.])?\\d+"))
def idContents = text ~ ("," ~> text)
def id = "Id(" ~> idContents <~ ")" ^^ { contents => Id(contents._1,contents._2) }
def text = """[A-Za-z0-9* ]+""".r
def wholeWord = """[A-Za-z]+""".r
def idBracketContents = id ~ ("|" ~> number) ^^ { contents => IdWithValue(contents._1,contents._2) }
def nonIdBracketContents = text ~ ("|" ~> text)
def bracketContents = idBracketContents | nonIdBracketContents
def outerBrackets = "(" ~> bracketContents <~ ")"
def target = wholeWord ~ outerBrackets
def parseItem(str: String): ParseResult[Any] = parse(target, str)
trait Keeper
case class Id(leftContents:String,rightContents:String) extends Keeper
case class IdWithValue(leftContents:Id,numberContents:String) extends Keeper
}
結果似乎沒有包含任何「Id」,所以似乎沒有任何可以解決的問題。也許'id'規則從來沒有被調用過(或者它從未在給定的輸入中成功),或者你拋棄了它的結果,無論哪個規則調用'id'。 – sepp2k
我在想,當映射(^^)完成時,'Id'將被放入輸出中。我只是把整個解析器放在一起,以防你可以看到我丟棄的地方。我可以解決這個問題,它甚至可能是最好的方式(但不會像'var'那樣需要使用'var'),因爲它們在創建時會存儲'Id'等內容。 –
你的意見是什麼?它看起來好像不符合'idBracketContents'規則,而是進入'nonIdBracketContents'規則。 – sepp2k