【发布时间】:2015-07-21 02:24:12
【问题描述】:
使用scala parser combinators 我已经解析了一些文本输入,并在此过程中创建了一些我自己的类型。结果打印正常。现在我需要检查输出,我认为它是一个包含我创建的类型的嵌套结构。我该怎么办?
这就是我调用解析器的方式:
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
这里只是为问题提供上下文是一些输入解析。我想联系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
}
【问题讨论】:
-
结果似乎不包含任何
Ids,因此似乎没有什么可获取的。也许id规则从未被调用(或者它从未在给定的输入上成功)或者你在任何规则调用id中丢弃了它的结果。 -
我在想,当映射 (^^) 完成时,
Id将被放入输出中。我只是把整个解析器放好,以防你能看到我丢弃的地方。我可以解决这个问题,它甚至可能是最好的方法(但是??功能不如需要使用var),方法是在创建Id等时存储它们。 -
您的意见是什么?看起来它根本不匹配
idBracketContents规则,而是进入nonIdBracketContents规则。 -
我的错误。你是对的,输入非常简单。我将更改文本以显示两个输入和相应的输出。但我的问题是为了更笼统。我如何获取
$tilde的所有内容,包括我创建的内容以及其他可能包含大量ParserResult[T]或类似内容的内容... -
仅供参考:在 Scala 中,该类称为
~,而不是$tilde。它只是在这里打印为$tilde,因为您使用的是Java 反射,而~在Java 中不是有效名称(与Scala 不同)。