【发布时间】:2014-01-25 19:56:47
【问题描述】:
我刚开始在 Scala 中使用解析器组合器,但在解析诸如“我喜欢 Scala”之类的句子时卡住了。 (单词以空格或句点结尾 (.))。
我从以下实现开始:
package example
import scala.util.parsing.combinator._
object Example extends RegexParsers {
override def skipWhitespace = false
def character: Parser[String] = """\w""".r
def word: Parser[String] =
rep(character) <~ (whiteSpace | guard(literal("."))) ^^ (_.mkString(""))
def sentence: Parser[List[String]] = rep(word) <~ "."
}
object Test extends App {
val result = Example.parseAll(Example.sentence, "I like Scala.")
println(result)
}
使用guard() 背后的想法是有一个句点来划分词尾,但不要消耗它以便句子可以。但是,解析器卡住了(添加 log() 表明它在反复尝试 word 和 character 解析器)。
如果我更改word 和sentence 的定义如下.
def word: Parser[String] =
rep(character) <~ (whiteSpace | literal(".")) ^^ (_.mkString(""))
def sentence: Parser[List[String]] = rep(word) <~ opt(".")
有什么想法吗?
【问题讨论】: