我刚刚开始在Scala中使用解析器组合器,但在解析器中解析句子,比如“我喜欢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
定义如下,它分析了一句,但语法描述不看的权利,也不会工作,如果我尝试添加解析器第(rep(sentence)
)等
def word: Parser[String] =
rep(character) <~ (whiteSpace | literal(".")) ^^ (_.mkString(""))
def sentence: Parser[List[String]] = rep(word) <~ opt(".")
任何想法可能会发生在这里?
谢谢。至于简化'word',你是对的,在这个例子中,你的解决方案更有意义。我试图解决的原始问题有一个更复杂的领域,其中'字符'的等价物有点复杂,需要指定它自己的解析器。 – ramnivas