对于使用scala组合器的第一个测试,我试图从句子中获取所有单词,但我只是从以下代码中得到"None":
import java.io.File
import scala.io.Source
import scala.util.parsing.combinator._
object PgnReader extends TagParser {
def parseFile(inputFile:File) = {
val pgnStream = Source.fromFile(inputFile)
val pgnStr = pgnStream.mkString
println(parseAll(tag, "Hello World !").getOrElse("None"))
pgnStream.close
}
}
trait TagParser extends RegexParsers {
val tag:Parser[String] = """[:alpha:]+""".r ^^ (_.toString)
}
我想得到类似的东西:
Hello
World
甚至像:
List(Hello, World)
我的代码是否正确?
我正在使用 scala 2.11 和 scala 组合器
你应该使用类似的东西来匹配令牌序列而不是一个令牌:
trait TagParser extends RegexParsers {
val tags: Parser[List[String]] = rep("""[a-zA-Z]+""".r)
}
rep
是:
用于重复的解析器生成器。
rep(p) 反复使用 p 来解析输入,直到 p 失败(结果 是 p 的连续结果的列表)。
http://www.scala-lang.org/files/archive/nightly/docs/parser-combinators/index.html#scala.util.parsing.combinator.RegexParsers
这可能会让你更接近:
trait TagParser extends RegexParsers {
val tag = rep("""p{Alpha}+""".r) ^^ (_.map(_.toString))
}
POSIX 字符类在 Scala 中具有不同的语法(继承自 Java)。 rep()
语法允许多次出现(给出List()
)。
这仍然会在感叹号上窒息,因此您可以稍微增加您的正则表达式。 我可能还会分别使用"标签"和"标签"的概念,以使事情更清楚:
trait TagParser extends RegexParsers {
val tags = rep(tag)
val tag = """p{Alpha}+|!""".r ^^ (_.toString)
}
...
println(parseAll(tags, "Hello World !").getOrElse(None))
...